- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读一些关于 C++ 中对齐的内容,但我不确定为什么仅包含 char
数组成员的类的对齐不是数组的大小,但事实证明始终为 1。例如
#include <iostream>
struct Foo{char m_[16];}; // shouldn't this have a 16 byte alignment?!
int main()
{
std::cout << sizeof(Foo) << " " << alignof(Foo);
}
在上面的代码中很明显sizeof(Foo)
是16,但是它的对齐是1,看代码的输出。
为什么 alignof(Foo)
在这种情况下是 1?请注意,如果我将 char m_[16];
替换为 int m_;
之类的基本类型,那么 alignof(Foo)
就会变成我想要的已经预料到了,即 sizeof(int)
(在我的机器上是 4)。
如果我简单地声明一个数组 char arr[16];
,也会发生同样的情况,然后 alignof(arr)
将为 1。
最佳答案
注意:数据对齐在this article中有详细解释.如果您想了解该术语的一般含义以及为什么它是一个重要问题,请阅读这篇文章。
对齐在 C++ 中被定义为一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数 [6.11.1] Alignment .
此外对齐必须是 2 的非负整数次幂 [6.11.4] Alignment .
当我们计算结构的对齐方式时,我们必须考虑另一个规则 [6.11.5] Alignment :
Alignments have an order from weaker to stronger or stricteralignments. Stricter alignments have larger alignment values. Anaddress that satisfies an alignment requirement also satisfies anyweaker valid alignment requirement.
虽然没有直接说明,但这些规则暗示结构对齐必须至少与其最严格对齐的成员的对齐一样严格。它可以更大,但不一定是,通常也不是。
因此,当确定 OP 示例中结构的对齐方式时,结构的对齐方式必须不低于其唯一成员类型 char[16]
的对齐方式。然后通过8.3.6 [expr.alignof] :
When alignof is applied to a reference type, the result is thealignment of the referenced type. When alignof is applied to an arraytype, the result is the alignment of the element type.
alignof(char[16])
等于 alignof(char)
由于 [6.11.6] Alignment 而通常为 1
:
(...) narrow character types shall have the weakest alignment requirement.
在这个例子中:
struct Foo
{
char c[16];
double d;
};
double
比 char
具有更严格的对齐方式,因此 alignof(Foo)
等于 alignof(double)
。
关于c++ - 为什么 char 数组的 alignof 总是 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42523833/
我在玩简单的例子时注意到,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
我是一名优秀的程序员,十分优秀!