对于任何对象类型T,sizeof(T)是否总是至少与alignof(T)一样大?直觉上看起来是这样的,因为即使在调整对象的对齐方式时,例如:
T
sizeof(T)
alignof(T)
struct small { char c; };
在正常情况下,它们的“大小”也会向上调整,以便数组中对象之间的关系在保持对齐的同时也有意义(至少在我的testing中是这样)。
struct alignas(16) small16 { char c; };
大小和对齐方式均为16。
s6fujrry1#
至少在标准的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的数组,即0sizeof和正的alignof。
alignof(Foo) > sizeof(Foo)
arr[0]
arr[1]
alignof(T) > sizeof(T)
sizeof(Foo) > 0
sizeof
alignof
wgx48brx2#
#include <iostream> typedef double foo __attribute__ ((aligned (64))); alignas(64) double bar; double baz __attribute__ ((aligned (64))); int main(int argc, char *argv[]) { std::cout << "foo sizeof: " << sizeof(foo) << " alignof: " << alignof(foo) << "\n"; std::cout << "bar sizeof: " << sizeof(bar) << " alignof: " << alignof(decltype(bar)) << "\n"; std::cout << "baz sizeof: " << sizeof(baz) << " alignof: " << alignof(decltype(baz)) << "\n"; }
编译:
clang++ -std=c++11 alignof_test.cpp -o alignof_test && ./alignof_test
输出:
foo sizeof: 8 alignof: 64 bar sizeof: 8 alignof: 8 baz sizeof: 8 alignof: 8
所以严格地说,没有,但上面的论点re:必须保留数组。
yrdbyhpb3#
根据引入alignof运算符的c++ 11 standard,sizeof定义如下(参见5.3.3表达式sizeof):sizeof运算符生成其操作数的对象表示形式中的字节数而alignof定义为(参见5.3.6表达式alignof):alignof表达式产生其操作数类型的对齐要求。由于alignof的定义指定了一个可能由用户提出的需求,而不是语言的规范,因此我们可以操纵编译器:
typedef uint32_t __attribute__ ((aligned (64))) aligned_uint32_t; std::cout << sizeof(aligned_uint32_t) << " -> " << alignof(aligned_uint32_t); // Output: 4 -> 64
正如其他人所指出的,这样的类型不能在数组中使用,例如,试图编译以下代码:
aligned_uint32_t arr[2];
结果以error: alignment of array elements is greater than element size表示由于数组要求指定的类型符合条件:sizeof(T) >= alignof(T)
error: alignment of array elements is greater than element size
sizeof(T) >= alignof(T)
guicsvcw4#
许多编译器允许大小为0的数组。对齐方式与单个元素的对齐方式相同。(其中,这对于在不能使用位域的情况下强制进行特定对齐非常有用)
0
4条答案
按热度按时间s6fujrry1#
至少在标准的C++中,对于任何你可以创建数组的东西(长度大于1),这都必须为真。
和
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的数组,即0sizeof
和正的alignof
。wgx48brx2#
编译:
输出:
所以严格地说,没有,但上面的论点re:必须保留数组。
yrdbyhpb3#
根据引入
alignof
运算符的c++ 11 standard,sizeof
定义如下(参见5.3.3表达式sizeof):sizeof运算符生成其操作数的对象表示形式中的字节数
而
alignof
定义为(参见5.3.6表达式alignof):alignof表达式产生其操作数类型的对齐要求。
由于
alignof
的定义指定了一个可能由用户提出的需求,而不是语言的规范,因此我们可以操纵编译器:正如其他人所指出的,这样的类型不能在数组中使用,例如,试图编译以下代码:
结果以
error: alignment of array elements is greater than element size
表示由于数组要求指定的类型符合条件:
sizeof(T) >= alignof(T)
guicsvcw4#
许多编译器允许大小为
0
的数组。对齐方式与单个元素的对齐方式相同。(其中,这对于在不能使用位域的情况下强制进行特定对齐非常有用)