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.