Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体

0
votes
answers
楼主
37 views
+10

內存對齊保證

1

以下代碼可交叉編譯內存對齊保證

struct Foo { 
    alignas(1) char c1; 
    alignas(1) char c2; 
    alignas(4) int i; 
}; 
static_assert(sizeof(Foo) == (sizeof(int) + 4), "No cross-compilable"); 

換句話說,是保證sizeof(Foo) == (sizeof(int) + 4)不管什麼架構/平臺?

+0

嚴格來說?我會說不。我不相信對齊規範否定了填充選項。 – StoryTeller

+0

@StoryTeller我考慮到了'+ 4'(就是填充「+ 2」)。 –

+1

是的,就是這樣。填充沒有綁定,真的。不可能超過您指定的數量,但不是真正的約束。 – StoryTeller

沙发
0
2

不能保證。這將在今天的許多體系結構上工作,但在具有8字節int(在8字節邊界上對齊)的系統上這不起作用。在這種情況下,你應該得到一個編譯器診斷,因爲你試圖對int應用一個不太嚴格的對齊;看[dcl.align]。

+0

請問您能否提供更多關於爲什麼在「8字節int arch」上無效的細節? –

+0

@BiagioFesta如果一個'int'有8個字節的對齊,那麼'Foo'中'i'的偏移量將是8,並且sizeof(Foo)將是16. – 1201ProgramAlarm

+0

你是對的!那麼'alignof(int)+ sizeof(int)== sizeof(Foo)'會是正確的嗎? (注意:'int'的'alignas(4)'被刪除) –

discard