- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我现在使用共享内存。
我无法理解 alignof
和 alignas
。
cppreference不清楚: alignof
返回“对齐”,但什么是“对齐”?为要对齐的下一个 block 添加的字节数?填充尺寸? Stack overflow/博客条目也不清楚。
谁能解释清楚alignof
和alignas
?
最佳答案
对齐是对可以存储值的第一个字节的内存位置的限制。 (需要提高处理器的性能并允许使用某些指令,这些指令仅适用于具有特定对齐方式的数据,例如 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/
我在玩简单的例子时注意到,alignof(struct_name) 始终是其结构的最大 alignof 的 alignof成分。情况总是(或几乎总是)如此吗? 最佳答案 Is the alignof
假设 T 和 const T 是两种大小相同且对齐方式相同的类型似乎是合理的,但在考虑了一些实际系统之后,似乎它们可能会有所不同。 让我解释一下: 假设您的系统具有两种类型的内存:RAM 和闪存(只读
我想强制特定的堆分配返回一个 64 字节对齐的地址,因为这是缓存行边界。我以为我可以这样做 int *p = new alignas(64) int; 但我的编译器似乎都没有给 p 一个 64 的倍数
我正在尝试设计一个标记指针类,其中指针的最低有效位可用作标志,但前提是它实际可用,即指向类型的对齐大于 1。 下面的工作,除了最后的问题,alignof() 不能应用于不完整的类型。 #include
在 C++11 中,我可以在没有对象的非静态数据成员上使用 alignof 吗? 如果我有一个类,例如 class A { int num; unsigned char letter; }
sizeof(char) 始终为 1,在我看来,类型的对齐要求永远不会大于其大小。引用即将发布的 C++11 标准 (3.11): An aligment is an implementation-d
我刚刚偶然发现了 std::alignment_of类型特征,以及它即将成为 friend 的 std::alignment_of_v。它们似乎经过专门设计,相当于对 alignof 的简单调用。 ,
sizeof 和 alignof 有什么区别? #include #define SIZEOF_ALIGNOF(T) std::cout<< sizeof(T) << '/' << alignof(
我现在使用共享内存。 我无法理解 alignof 和 alignas。 cppreference不清楚: alignof 返回“对齐”,但什么是“对齐”?为要对齐的下一个 block 添加的字节数?填
我无法理解 alignas 的目的是什么和 alignof关键字是,我不太确定我完全理解对齐是什么。 据我了解,如果内存地址可被 n 整除,则它与 n 字节对齐,也就是说,可以通过一次计算“n”个字节
我刚刚了解了 alignof 和 alignas C++ 关键字,但我想不出任何开发人员想要使用这些关键字的实际案例。 有人知道这些关键字的任何实际用例吗? 最佳答案 alignas 说明符的一个常见
我正在尝试运行 alignof 运算符的示例。 #include struct Empty {}; struct Foo { int f2; float f1; cha
以下代码(msvc 2012,32 位): #include int main() { double d; std::cout<<_alignof(double)<
是 alignof(T*)对于所有可能的类型 T 是相同的值?怎么样sizeof(T*) ? 请根据标准允许/指定的内容而不是不同编译器的当前情况进行回答。 最佳答案 该标准对指针的大小和对齐没有太多
如果我定义一个具有特定对齐要求的简单类型,该类型的 std::vector 难道不应该为每个元素 遵守对齐吗? 考虑下面的例子 typedef std::array alignas(32) avx_p
我正在阅读一些关于 C++ 中对齐的内容,但我不确定为什么仅包含 char 数组成员的类的对齐不是数组的大小,但事实证明始终为 1。例如 #include struct Foo{char m_[16
如果我定义一个具有特定对齐要求的简单类型,该类型的 std::vector 难道不应该为每个元素 遵守对齐吗? 考虑下面的例子 typedef std::array alignas(32) avx_p
对于任何对象类型 T,是否总是 sizeof(T) 至少与 alignof(T) 一样大? 直觉上似乎是这样,因为即使您调整对象的对齐方式,例如: struct small { char c; }
alignof(N) == sizeof(N) 其中 N 是否为整数类型? 我要求同时使用 C 和 C++,希望这不是问题。 最佳答案 它是特定于机器的。在 32 位机器上,alignof(int64
我是一名优秀的程序员,十分优秀!