当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?
我有一个C#背景.我非常喜欢像C这样的低级语言.
在C#中,struct默认情况下由编译器布局内存.编译器可以隐式地重新排序数据字段或填充字段之间的附加位.因此,我必须指定一些特殊属性来覆盖此行为以获得精确布局.
AFAIK,C struct默认情况下不重新排序或对齐a的内存布局.但是,我听说有一个很难找到的例外.
什么是C的内存布局行为?什么应该重新订购/对齐而不是?
如果我有这样的结构:
struct S {
ANY_TYPE a;
ANY_TYPE b;
ANY_TYPE c;
} s;
Run Code Online (Sandbox Code Playgroud)
我可以安全地假设以下假设在所有平台上始终都是正确的吗?
((char *)&s.a) < ((char *)&s.c)
((char *)&s.a + sizeof(s.a) + sizeof(s.b)) <= ((char *)&s.c)
Run Code Online (Sandbox Code Playgroud)
在C++中呢?