假设我有一些T必须N字节对齐的类型.现在我声明一个类型的数组T:
T array[size];
Run Code Online (Sandbox Code Playgroud)
阵列是否具有与类型相同的对齐要求,T还是具有任何其他对齐要求?
我再一次质疑一个长期存在的信念.
直到今天,我相信以下结构的对齐通常为4,大小通常为5 ...
struct example
{
int m_Assume_32_Bits;
char m_Assume_8_Bit_Bytes;
};
Run Code Online (Sandbox Code Playgroud)
由于这个假设,我有数据结构代码使用offsetof来确定数组中两个相邻项之间的字节距离.今天,我发现了一些使用sizeof的旧代码,它本不应该,不明白为什么我没有错误,编写单元测试 - 测试让我感到惊讶.
一些调查显示我用于测试的类型的大小(类似于上面的结构)是对齐的精确倍数 - 即8个字节.它在最终成员之后有填充.这是一个为什么我从没想过这个的例子......
struct example2
{
example m_Example;
char m_Why_Cant_This_Be_At_Offset_6_Bytes;
};
Run Code Online (Sandbox Code Playgroud)
一些谷歌搜索显示的例子清楚表明允许最后一个成员之后的填充 - 例如http://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding("或结构的末尾"位) .
这有点令人尴尬,因为我最近发布了这条评论 - 使用struct padding(我对该答案的第一个评论).
我似乎无法确定的是,这个填充到对齐的精确倍数是否由C++标准保证,或者它是否只是允许的内容以及某些(但可能不是全部)编译器.
那么 - 根据C++标准,结构的大小是否需要是该结构对齐的精确倍数?
如果C标准有不同的保证,我也对此感兴趣,但重点是C++.
#include <iostream>
using namespace std;
int main()
{
alignas(double) unsigned char c[1024]; // array of characters, suitably aligned for doubles
alignas(16) char d[100]; // align on 16 byte boundary
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
constexpr int n = alignof(int); // ints are aligned on n byte boundarie
cout<<n<<endl;
}
Run Code Online (Sandbox Code Playgroud)
这是代码,因为alignas(double) unsigned char c[1024];它意味着c应该对齐double,double是8字节.所以我认为sizeof(c)应该是1024*8字节,但控制台输出是1024.
所以我很困惑.谁能告诉我原因?