我现在使用的是共享内存。
我不明白alignof和alignas的意思。
对齐不清楚:alignof返回“cppreference”,但什么是“对齐”?要为下一个要对齐的块添加的字节数?填充大小?Stack overflow /博客条目也不清楚。
有人能解释清楚alignof和alignas吗?
发布于 2014-01-16 07:46:15
对齐是对一个值的第一个字节可以存储的内存位置的限制。(需要提高处理器的性能,并允许使用仅处理具有特定对齐的数据的特定指令,例如,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 2other关键字
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)。
仍然合法:
alignas(alignof(float)) float SqDistance;对齐为16的然后将被放置在下一个可用地址上,该地址是16的倍数(可能存在来自上次使用的地址的隐式填充)。
发布于 2013-06-14 02:20:37
对齐不是填充(尽管有时会引入填充来满足对齐要求)。它是C++类型的固有属性。将其放入标准文本(3.11[basic.align])
对象类型具有对齐要求(3.9.1、3.9.2),这些要求对可分配该类型的对象的地址进行了限制。对齐是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象都施加了对齐要求;可以使用对齐说明符(7.6.2)请求更严格的对齐。
发布于 2013-06-14 03:47:58
每种类型都有对齐要求。通常,这是因为可以有效地访问该类型的变量,而不必使CPU为了访问该数据类型的任何给定成员而生成多于一次的读/写访问。此外,它还确保有效地复制整个变量。alignof将返回给定类型的对齐要求。
alignas用于强制数据类型对齐(只要它不像alignof所说的数据类型返回的那样严格)
https://stackoverflow.com/questions/17091382
复制相似问题