Я читал это Когда мне нужно беспокоиться о выравнивании?, но я все еще не знаю, нужно ли мне беспокоиться о не выровненном указателе, возвращаемом при размещении нового оператора - например в этом примере:
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. Может быть, единственными недостатками в моем случае были бы штраф за производительность, я имею в виду невысокую стоимость доступа больше, чем выровнен?