gpt4 book ai didi

c++ - 内存对齐 : how to use alignof/alignas?

转载 作者:IT老高 更新时间:2023-10-28 13:23:45 25 4
gpt4 key购买 nike

我现在使用共享内存。

我无法理解 alignofalignas

cppreference不清楚: alignof 返回“对齐”,但什么是“对齐”?为要对齐的下一个 block 添加的字节数?填充尺寸? Stack overflow/博客条目也不清楚。

谁能解释清楚alignofalignas

最佳答案

对齐是对可以存储值的第一个字节的内存位置的限制。 (需要提高处理器的性能并允许使用某些指令,这些指令仅适用于具有特定对齐方式的数据,例如 SSE 需要对齐到 16 字节,而 AVX 需要对齐到 32 字节。)

16 对齐意味着只有 16 的倍数的内存地址是唯一有效的地址。

alignas

强制对齐到所需的字节数。您只能对齐 2 的幂:1、2、4、8、16、32、64、128、...

#include <cstdlib>
#include <iostream>

int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}

示例输出:

0xbfa493e0
0xbfa49000 // note how many more "zeros" now.
// binary equivalent
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000 // every zero is just a extra power of 2

另一个关键字

alignof

很方便,你不能这样做

int a[4];
assert(a % 16 == 0); // check if alignment is to 16 bytes: WRONG compiler error

但你可以做到

assert(alignof(a) == 16);
assert(alignof(b) == 1024);

请注意,实际上这比简单的“%”(模数)运算更严格。事实上,我们知道对齐到 1024 字节的东西必然会对齐到 1、2、4、8 字节,但是

 assert(alignof(b) == 32); // fail.

所以更准确地说,“alignof”返回 2 的最大幂来对齐某物。

此外,alignof 也是提前了解基本数据类型的最小对齐要求的好方法(它可能会返回 1 表示字符,4 表示 float 等)。

仍然合法:

alignas(alignof(float)) float SqDistance;

对齐为 16 的东西将被放置在下一个可用地址上,该地址是 16 的倍数(最后使用的地址可能有隐式填充)。

关于c++ - 内存对齐 : how to use alignof/alignas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17091382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com