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