c++ - 对于所有对象类型 T,sizeof(T) >= alignof(T) 是否总是如此?

对于任何对象类型 T,是否总是 sizeof(T) 至少与 alignof(T) 一样大?

直觉上似乎是这样,因为即使您调整对象的对齐方式,例如:

struct small {
  char c;
};

在正常情况下,它们的“大小”也向上调整,以便数组中对象之间的关系在保持对齐的同时有意义(至少在我的 testing 中。例如:

struct alignas(16) small16 {
  char c;
};

大小和对齐方式均为 16。

最佳答案

至少在标准 C++ 中,对于任何可以创建数组(长度 > 1)的东西,都必须是这样。如果你有

Foo arr[2];

alignof(Foo) > sizeof(Foo),那么 arr[0]arr[1] 不能同时是对齐。

作为 Zalman Stern's example但是,至少有一些编译器允许您声明一个对齐大于其大小的类型,结果编译器根本不允许您声明该类型的数组。这不是符合标准的 C++(它使用类型属性,即 are a GCC extension),但这意味着您可以在实践中使用 alignof(T) > sizeof(T)

数组参数假定 sizeof(Foo) > 0,对于标准支持的任何类型都是如此,但 o11c shows编译器扩展破坏该保证的示例:一些编译器允许 0 长度数组,其中 0 sizeof 和正 alignof

关于c++ - 对于所有对象类型 T,sizeof(T) >= alignof(T) 是否总是如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46457449/

相关文章:

c++ - 为 Windows 编写超薄 C++ 程序(如 uTorrent)

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

c++ - 为什么我们在 C++ 中使用 std::function 而不是原来的 C 函数指针?

c++ - 为什么这个包含 rand() 的 C++11 代码多线程比单线程慢?

c++ - C 和 C++ 中的多字 rune 字

c++ - QObject 多重继承

c++ - 在 C++ 中设置本地环境变量

c++ - 打包结构是可移植的吗?

c++ - 访问类中定义的 friend 功能

c++ - 向 Python 公开 C++ API