c++ - new char 实际上是否保证了类类型的对齐内存?

标签 c++ c++11 language-lawyer

通过 new char[sizeof(T)] 分配一个缓冲区,保证为 T 类型分配正确对齐的内存,其中 的所有成员T 有它们自然的、实现定义的对齐方式(也就是说,您没有使用 alignas 关键字来修改它们的对齐方式)。

我在这里的一些答案中看到了这个保证,但我并不完全清楚标准是如何达到这个保证的。标准的 5.3.4-10 给出了基本要求:本质上 new char[] 必须与 max_align_t 对齐。

我缺少的是表示 alignof(T) 将始终是最大值为 max_align_t 的有效对齐方式。我的意思是,这似乎很明显,但结构的对齐结果是否必须最多为 max_align_t?甚至第 3.11-3 点说可能支持扩展对齐,所以编译器可以自己决定一个类是过度对齐的类型吗?

最佳答案

保证表达式 new char[N]new unsigned char[N] 为任何对象返回足够对齐的内存。见§5.3.4/10 "[...] 对于 char 和 unsigned char 数组,它们之间的区别 new-expression 的结果和分配返回的地址 函数应是最严格基本函数的整数倍 大小不大于任何对象类型的对齐要求 (3.11) 比正在创建的数组的大小。 [注:因为分配 假设函数返回指向存储的指针 适本地对齐任何类型的对象与基本 对齐,这种对数组分配开销的约束允许 将字符数组分配到其他对象的常见习语 稍后将放置类型。 ——尾注]"。

当然,从风格的角度来看:如果您想要分配原始 内存,这样说更清楚:operator new(N)。从概念上讲, new char[N] 创建 N char; operator new(N) 分配 N 个字节。

关于c++ - new char 实际上是否保证了类类型的对齐内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10587879/

相关文章:

c++ - 在原始类型指针之间进行转换

c++ - 使用 new 表达式的非静态数据成员初始化

c++ - 如何在 gedit 中使用外部工具交互式运行 C++ 程序

c++ - 寻找中位数的 Ceil 函数

C++:重命名模板类

c - 具有正确文件长度和缓冲区分配的 fread 段错误

c++ - 在没有事件异常的情况下终止调用(多线程合并排序)

c++ - 这个模板定义在 C++ 中意味着什么?

c++ - 具有依赖类型的字符串字面量——不可能?

c++ - 纯虚函数可能没有内联定义。为什么?