在 C++ 中为非过度对齐类型获取适当对齐的堆存储

问题描述 投票:0回答:1

在某些用例中,您需要先分配存储空间,然后再在此存储中创建对象。
然后为了创建这些对象,您可能需要使用placement new:

T *pobj = new(pstorage);

但是您必须提供正确对齐的

pstorage

我不明白operator new的预期行为:

// properly aligned heap storage to hold N contiguous T objects
unsigned char *storage = new unsigned char[N*sizeof(T)];

new
表达式是否保证返回一个指向适合任何“非过度对齐”类型对齐的地址的指针,但并不意味着一些内存碎片(在连续调用
new
弱对齐类型的情况下)?

c++ memory-management alignment heap-memory new-operator
1个回答
0
投票

C++ 中有三种类型的对齐方式:fundamentalextendednew-extended [basic.align]over-aligned 类型是一种具有扩展对齐方式的类型,但

operator new
的相关对齐方式实际上是 new-extended

新表达式是否保证返回指向适合任何“非过度对齐”类型的地址的指针

operator new
保证返回一个指针,该指针适合任何没有新扩展对齐且具有所请求大小的类型。

© www.soinside.com 2019 - 2024. All rights reserved.