【发布时间】:2012-07-31 16:13:20
【问题描述】:
我读到了这个When should I worry about alignment?,但我仍然不知道我是否需要担心放置 new 运算符返回的指针不对齐 - 就像在这个例子中一样:
class A {
public:
long double a;
long long b;
A() : a(1.3), b(1234) {}
};
char buffer[64];
int main() {
// (buffer + 1) used intentionally to have wrong alignment
A* a = new (buffer + 1) A();
a->~A();
}
__alignof(A) == 4、(buffer + 1) 未与 4 对齐。但一切正常 - 完整示例在这里:http://ideone.com/jBrk8
如果这取决于架构,那么我使用的是:linux/powerpc/g++ 4.x.x。
[更新] 在发布这个问题后,我阅读了这篇文章:http://virtrev.blogspot.de/2010/09/memory-alignment-theory-and-c-examples.html。 也许在我的情况下唯一的缺点是性能损失,我的意思是未对齐的访问成本高于对齐?
【问题讨论】:
-
x86 对对齐问题特别宽容,而 powerpc 则不然。
-
Placement new 只是返回给定的指针。
-
未对齐的访问通常受支持但速度较慢。 x86 就是这种情况,但我不知道 PPC。
-
@FatalError,对于今天的缓存架构,我不确定这是否是真的。如果您越过缓存线边界,您肯定会看到命中。
-
@R.MartinhoFernandes,它还调用了在这种情况下设置一些成员的构造函数。如果有问题,它应该触发它。
标签: c++ g++ memory-alignment powerpc placement-new