分享方式:


/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 (一致性)