如何判断 C++ 中的最大数据对齐要求
How to tell the maximum data alignment requirement in C++
参考这个问题和答案 Memory alignment : how to use alignof / alignas? "Alignment is a restriction on which memory positions a value's first byte can be stored." C++ 中是否有一种可移植的方法来找出指令不出错所需的最高对齐粒度(例如在 ARM 中)? alignof(intmax_t)
是否足够,因为它是最大的整数原始类型?
此外,malloc 中的某些内容如何将数据与结构的边界对齐?例如,如果我有这样的结构
alignas(16) struct SomethingElse { ... };
SomethingElse
结构需要与 16 字节的倍数的边界对齐。现在,如果我像这样从 malloc 请求结构的内存
SomethingElse* ptr = malloc(sizeof(SomethingElse));
那么当 malloc returns 一个指向像 40
这样的地址的指针时会发生什么?这是否无效,因为指向 SomethingElse
对象的指针必须是 16 的倍数?
您可能正在寻找 std::max_align_t
How to tell the maximum data alignment requirement in C++
有std::max_align_t
个
is a POD type whose alignment requirement is at least as strict (as large) as that of every scalar type.
矢量指令可以使用比任何标量要求更高对齐的数组操作数。我不知道是否有一种可移植的方法来找出上限。
要查找特定类型的对齐要求,您可以使用 alignof
。
Further, how does something in malloc align data to a struct's boundaries?
malloc
对齐到足以满足任何标量的某个边界。实际上与 std::max_align_t
.
完全相同
"overaligned" 类型无法正确对齐。过度对齐是指对齐要求高于 std::max_align_t
.
的类型
Then what happens when malloc returns a pointer that points to an address like 40?
取消引用这样的 SomethingElse*
会有未定义的行为。
Is that invalid since the pointer to SomethingElse objects must be a multiple of 16?
是的。
how even would one go about fixing that? There is no way to tell malloc the alignment that you want right?
要为过度对齐的类型分配内存,您需要std::aligned_alloc
,这将在C++17中引入。
在那之前,您可以使用特定于平台的函数,例如 posix_memalign
或者您可以使用 std::malloc
过度分配(分配对齐 - 1 个额外字节),然后使用 std::align
找到正确的边界。但是你必须分别跟踪缓冲区的开始和内存块的开始。
参考这个问题和答案 Memory alignment : how to use alignof / alignas? "Alignment is a restriction on which memory positions a value's first byte can be stored." C++ 中是否有一种可移植的方法来找出指令不出错所需的最高对齐粒度(例如在 ARM 中)? alignof(intmax_t)
是否足够,因为它是最大的整数原始类型?
此外,malloc 中的某些内容如何将数据与结构的边界对齐?例如,如果我有这样的结构
alignas(16) struct SomethingElse { ... };
SomethingElse
结构需要与 16 字节的倍数的边界对齐。现在,如果我像这样从 malloc 请求结构的内存
SomethingElse* ptr = malloc(sizeof(SomethingElse));
那么当 malloc returns 一个指向像 40
这样的地址的指针时会发生什么?这是否无效,因为指向 SomethingElse
对象的指针必须是 16 的倍数?
您可能正在寻找 std::max_align_t
How to tell the maximum data alignment requirement in C++
有std::max_align_t
个
is a POD type whose alignment requirement is at least as strict (as large) as that of every scalar type.
矢量指令可以使用比任何标量要求更高对齐的数组操作数。我不知道是否有一种可移植的方法来找出上限。
要查找特定类型的对齐要求,您可以使用 alignof
。
Further, how does something in malloc align data to a struct's boundaries?
malloc
对齐到足以满足任何标量的某个边界。实际上与 std::max_align_t
.
"overaligned" 类型无法正确对齐。过度对齐是指对齐要求高于 std::max_align_t
.
Then what happens when malloc returns a pointer that points to an address like 40?
取消引用这样的 SomethingElse*
会有未定义的行为。
Is that invalid since the pointer to SomethingElse objects must be a multiple of 16?
是的。
how even would one go about fixing that? There is no way to tell malloc the alignment that you want right?
要为过度对齐的类型分配内存,您需要std::aligned_alloc
,这将在C++17中引入。
在那之前,您可以使用特定于平台的函数,例如 posix_memalign
或者您可以使用 std::malloc
过度分配(分配对齐 - 1 个额外字节),然后使用 std::align
找到正确的边界。但是你必须分别跟踪缓冲区的开始和内存块的开始。