Мне действительно нужно беспокоиться о выравнивании при использовании нового оператора размещения?
Я читал это Когда мне стоит беспокоиться о выравнивании? но я до сих пор не знаю, нужно ли мне беспокоиться о не выровненном указателе, возвращаемом оператором размещения 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/jBrk
Если это зависит от архитектуры, то я использую: linux / powerpc / g ++ 4.x.x.
[ОБНОВЛЕНИЕ] Сразу после публикации этого вопроса я прочитал эту статью:http: //virtrev.blogspot.de/2010/09/memory-alignment-theory-and-c-examples.htm. Может быть, единственным недостатком в моем случае было бы снижение производительности, я имею в виду стоимость выравниваемого доступа больше, чем выравнивание?