/Zc:alignedNew
(C++17 過度調整配置)
啟用C++17 過度對齊new
、動態記憶體配置在界限上對齊的支援,大於大小上限標準對齊類型的預設值。 max_align_t
語法
/Zc:alignedNew
[-
]
備註
MSVC 編譯器與程式庫支援 C++17 標準溢出對齊的動態記憶體配置。 /Zc:alignedNew
指定 選項時,動態配置,例如 new Example;
會遵守的對齊方式Example
,即使大於 max_align_t
,也是任何基本類型所需的最大對齊方式。 當配置型別的對齊方式不超過原始運算子 new
所保證的對齊方式時,作為預先定義巨集 __STDCPP_DEFAULT_NEW_ALIGNMENT__
的值,語句 new Example;
會產生對的呼叫 ::operator new(size_t)
,就像在 C++14 中所做的一樣。 當對齊方式大於 __STDCPP_DEFAULT_NEW_ALIGNMENT__
時,實作會改用 ::operator new(size_t, align_val_t)
來取得記憶體。 同樣地,刪除溢出對齊的類型會叫用 ::operator delete(void*, align_val_t)
或有大小的 delete 特徵標記 ::operator delete(void*, size_t, align_val_t)
。
/Zc:alignedNew
只有在或更新版本啟用時/std:c++17
,才能使用此選項。 在 /std:c++17
或更新版本中, /Zc:alignedNew
預設會啟用以符合C++標準。 如果您實作 運算子 new
的唯一原因,而且 delete
是支援過度對齊的配置,則您可能不再需要C++17 或更新版本的模式中的此程序代碼。 若要關閉此選項,並還原為 的 C++14 行為 new
,以及 delete
當您使用 /std::c++17
或更新版本時,請指定 /Zc:alignedNew-
。 如果您實作 運算符new
,delete
但尚未準備好實作具有 align_val_t
參數的過度對齊運算元new
和delete
多載,請使用 /Zc:alignedNew-
選項來防止編譯程式和標準連結庫產生對過度對齊多載的呼叫。 選項 /permissive-
不會變更的預設設定 /Zc:alignedNew
。
/Zc:alignedNew
從 Visual Studio 2017 15.5 版開始支援。
範例
此範例示範當選項設定時/Zc:alignedNew
,運算元new
和運算符delete
的行為。
// alignedNew.cpp
// Compile by using: cl /EHsc /std:c++17 /W4 alignedNew.cpp
#include <iostream>
#include <malloc.h>
#include <new>
// "old" unaligned overloads
void* operator new(std::size_t size) {
auto ptr = malloc(size);
std::cout << "unaligned new(" << size << ") = " << ptr << '\n';
return ptr ? ptr : throw std::bad_alloc{};
}
void operator delete(void* ptr, std::size_t size) {
std::cout << "unaligned sized delete(" << ptr << ", " << size << ")\n";
free(ptr);
}
void operator delete(void* ptr) {
std::cout << "unaligned unsized delete(" << ptr << ")\n";
free(ptr);
}
// "new" over-aligned overloads
void* operator new(std::size_t size, std::align_val_t align) {
auto ptr = _aligned_malloc(size, static_cast<std::size_t>(align));
std::cout << "aligned new(" << size << ", " <<
static_cast<std::size_t>(align) << ") = " << ptr << '\n';
return ptr ? ptr : throw std::bad_alloc{};
}
void operator delete(void* ptr, std::size_t size, std::align_val_t align) {
std::cout << "aligned sized delete(" << ptr << ", " << size <<
", " << static_cast<std::size_t>(align) << ")\n";
_aligned_free(ptr);
}
void operator delete(void* ptr, std::align_val_t align) {
std::cout << "aligned unsized delete(" << ptr <<
", " << static_cast<std::size_t>(align) << ")\n";
_aligned_free(ptr);
}
struct alignas(256) OverAligned {}; // warning C4324, structure is padded
int main() {
delete new int;
delete new OverAligned;
}
此輸出通常適用於 32 位元的組建。 指標值會依據應用程式在記憶體中執行的位置而不同。
unaligned new(4) = 009FD0D0
unaligned sized delete(009FD0D0, 4)
aligned new(256, 256) = 009FE800
aligned sized delete(009FE800, 256, 256)
如需 Visual C++ 中一致性問題的相關資訊,請參閱 Nonstandard Behavior (非標準行為)。
在 Visual Studio 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。
修改 [其他選項] 屬性以包含
/Zc:alignedNew
或/Zc:alignedNew-
,然後選擇 [確定]。