Share via


/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- 。 如果您實作 運算子 newdelete 但尚未準備好實作具有 align_val_t 參數的過度對齊運算子 newdelete 多載,請使用 /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 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。

  3. 修改 [其他選項] 屬性以包含 /Zc:alignedNew/Zc:alignedNew- ,然後選擇 [ 確定 ]。

另請參閱

/Zc (一致性)