sizeof和alignof有什么区别?
#include <iostream>
#define SIZEOF_ALIGNOF(T) std::cout<< sizeof(T) << '/' << alignof(T) << std::endl
int main(int, char**)
{
SIZEOF_ALIGNOF(unsigned char);
SIZEOF_ALIGNOF(char);
SIZEOF_ALIGNOF(unsigned short int);
SIZEOF_ALIGNOF(short int);
SIZEOF_ALIGNOF(unsigned int);
SIZEOF_ALIGNOF(int);
SIZEOF_ALIGNOF(float);
SIZEOF_ALIGNOF(unsigned long int);
SIZEOF_ALIGNOF(long int);
SIZEOF_ALIGNOF(unsigned long long int);
SIZEOF_ALIGNOF(long long int);
SIZEOF_ALIGNOF(double);
}
Run Code Online (Sandbox Code Playgroud)
将输出
1/1 1/1 2/2 2/2 4/4 4/4 4/4 4/4 4/4 8/8 8/8 8/8
我想我不知道对齐是什么......?
对于任何对象类型T,它总是sizeof(T)至少与大小一样大alignof(T)吗?
直观地看起来如此,因为即使你调整对象的对齐方式,例如:
struct small {
char c;
};
Run Code Online (Sandbox Code Playgroud)
通常情况下,它们的"大小"也会向上调整,以便在保持对齐的同时,阵列中对象之间的关系是有意义的(至少在我的测试中.例如:
struct alignas(16) small16 {
char c;
};
Run Code Online (Sandbox Code Playgroud)
两者的大小和对齐都是16.
我偶然发现了std::alignment_of类型特征,以及即将成为朋友的类型特征std::alignment_of_v.它们似乎专门设计为等同于普通调用alignof,并且未来添加_v帮助程序表明它不仅仅是遗留位.
有什么用的std::alignment_of(_v),当我们有alignof?
我试过这个
struct Foo(T)
{
align(8) void[T.sizeof] data;
}
Run Code Online (Sandbox Code Playgroud)
但
static assert(Foo!(int).data.alignof == 8);
Run Code Online (Sandbox Code Playgroud)
失败了,告诉我对齐仍然是1代替8.
为什么这样,以及如何修复它,以便它适用于2的幂(不仅仅是8)的任意对齐?
在C++中,似乎所有的整数类型(int,long long int,std::uint16_t,...)和浮点类型,它始终是sizeof(T) == alignof(T).
这个编译器/平台是特定的,还是保证是真的?是否有一个平台,其中int32_ts不需要在32位边界上对齐(只要它们不重叠)?