Jakie są ograniczenia wyrównania standardowego nowego globalnego operatora domyślnego?

Pracuję nad starszym kodem, który używa ATLCComBSTR rodzaj. Zmieniam go, aby skompilował się przy użyciu Visual C ++ Express Edition, który nie jest dostarczany z ATL. Użyłem tylko bardzo małego podzbioruCComBSTR, więc robienie tego jest dość proste.

Jednak przy przydzielaniuBSTR blok pamięci, muszę wypełnić pierwsze cztery bajty prefiksem o długości 4 bajtów. Obawiam się, że jeśli użyjęnew char[size] wyrażenie do przydzielenia pamięci dla ciągu, który spowoduje błędy wyrównania z powodu przydzielonegochar tablica nie ma prawidłowego wyrównania dla prefiksu czterobajtowego.

Czy w standardzie jest coś, co określa wymagania dotyczące wyrównania zwracanych wartościnew mieć? W C ++ 11 widzę tylko:

5.3.4 / 1 [expr.new]
Jest definiowany przez implementację, czy obsługiwane są typy wyrównane (3.11).

3,11 / 6 [basic.align]
Zapotrzebowanie na wyrównanie dla kompletnego typu można zapytać przy użyciu wyrażenia alignof (5.3.6). Ponadto typy char, signed char i unsigned char będą miały najsłabszy wymóg wyrównania. [Uwaga: Dzięki temu typy znaków mogą być używane jako typ bazowy dla wyrównanego obszaru pamięci (7.6.2) .— uwaga końcowa]

Uważam to za nieco mylące - „najsłabszy wymóg wyrównania” mówi mi „najmniej rygorystyczne ograniczenie wyrównania”, ale uwaga pod tym wydaje się wskazywać, że standard oznacza przeciwieństwo.

Czy jestem bezpieczny przy użyciunew char[sizeof(uint32_t) + 2*(length + 1)] bufor jakoBSTR lubię to?

EDYTOWAĆ: Właśnie zrozumiałem, że w tym konkretnym przypadkuBSTR, należy użyć SysAllocString, aby mimo wszystko przydzielić łańcuch; ale nadal interesuje mnie, czy można z niego korzystaćnew w ten sposób.

questionAnswers(3)

yourAnswerToTheQuestion