我正在用C++98编写一个切片分配器。分配器将包含两个模板类:
- 将分配实际内存的低级分配器类,
- 高级分配器类,它将请求的对象包装
char[]
为适当长度的数组。
我想知道我下面关于对齐的假设是否有效。
首先,我假设在一个对象数组(类型为T
)中,每个对象都正确对齐。我在标准中没有看到任何具体的内容,但这对我来说似乎是一个合理的假设。
考虑到,如果我采用sizeof(T[n])
,返回的大小应该包含任何必要的填充,因此适合存储数组T[n]
。
其次,18.4.1.1 ( operator new
) 规定:
1效果:由new 表达式(5.3.4)调用的分配函数(3.7.3.1)用于分配适当对齐的存储字节以表示该大小的任何对象。
size
因此,我假设::operator new(sizeof(T[n]))
应该为数组创建一个适当对齐的内存块T[n]
。
最后,9.2(类成员)声明:
17 指向 POD-struct 对象的指针,使用 a 进行适当转换
reinterpret_cast
,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。[注意:因此,在 POD 结构对象中可能存在未命名的填充,但不是在其开头,这是实现适当对齐所必需的。]
因此,我会假设struct
类似:
struct node
{
char data[sizeof(T[n])];
node* next;
};
通过分配new node
,data
成员将正确对齐数组T[n]
。
上述假设是正确的还是我遗漏了什么?我相信我必须手动实现链表,因为 C++ 标准没有对节点成员顺序提供任何保证。