【发布时间】:2011-04-29 21:31:09
【问题描述】:
STL向量通常是如何实现的?它有一个 char[] 的原始存储,它偶尔会按某个因素调整大小,然后在元素被 push_back 时调用placement new(我应该注意一个非常有趣的语法形式 - 语言学家应该研究诸如 push_back 之类的动词形式:)
然后是对齐要求。所以一个自然的问题出现了,我如何在 char[] 上调用一个新的位置并确保满足对齐要求。所以我在 2003 年的 C++ 标准中搜索了“对齐”这个词,发现了这些:
第 3.9 条第 5 条
对象类型有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是实现定义的整数值,表示字节数;对象分配在满足其对象类型对齐要求的地址。
第 5.3.4 条第 10 条:
new 表达式将请求的空间量作为 std::size_t 类型的第一个参数传递给分配函数。该参数不应小于正在创建的对象的大小;只有当对象是一个数组时,它才可能大于正在创建的对象的大小。对于 char 和 unsigned char 数组,new-expression 的结果与分配函数返回的地址之间的差应是任何大小不大于正在创建的数组的大小。 [注意:因为分配函数被假定返回指向为任何类型的对象适当对齐的存储的指针,所以对数组分配开销的这种约束允许分配字符数组的常见习惯用法,稍后将在其中放置其他类型的对象。 ]
这两个对我上面的问题给出了一个非常令人满意的答案,但是......
声明1:
X 类型对象的对齐要求,其中 sizeof(X) == n 至少要求 X 的地址可以被 n 整除或类似的东西(将所有与架构相关的东西放入“或类似的东西”中)。
问题1:请确认、完善或否认上述说法1。
Statement2:如果 statement1 是正确的,那么从标准中的第二个引用可以看出,在可被 5000000 整除的地址处分配了一个 5000000 个字符的数组,如果我只需要这样的 char 数组而不是用于可能放置其他对象的原始存储。
问题 2: 那么,成功分配 1000 个字符的机会真的低于 500 个 shorts(假设 short 是 2 个字节)吗?这实际上是一个问题吗?
【问题讨论】: