Partilhar via


/Zc:alignedNew (Alocação sobrealinhada do C++17)

Habilite o suporte para C++17 sobrealinhado new, alocação de memória dinâmica alinhada em limites maiores do que o padrão para o tipo alinhado padrão de tamanho máximo, max_align_t.

Sintaxe

/Zc:alignedNew[-]

Observações

O compilador e a biblioteca MSVC suportam a alocação de memória dinâmica sobrealinhada padrão C++17. Quando a /Zc:alignedNew opção é especificada, uma alocação dinâmica, como a que new Example; respeita o alinhamento mesmo Example quando é maior que max_align_t, o maior alinhamento necessário para qualquer tipo fundamental. Quando o alinhamento do tipo alocado não é mais do que o alinhamento garantido pelo operador neworiginal, disponível como o valor da macro __STDCPP_DEFAULT_NEW_ALIGNMENT__predefinida, a instrução new Example; resulta em uma chamada para ::operator new(size_t) como fez em C++14. Quando o alinhamento é maior que __STDCPP_DEFAULT_NEW_ALIGNMENT__, a implementação obtém a memória usando ::operator new(size_t, align_val_t). Da mesma forma, a exclusão de tipos sobrealinhados invoca ::operator delete(void*, align_val_t) ou a assinatura ::operator delete(void*, size_t, align_val_t)de exclusão de tamanho .

A /Zc:alignedNew opção só está disponível quando /std:c++17 ou mais tarde está ativada. Sob /std:c++17 ou posterior, /Zc:alignedNew está habilitado por padrão para estar em conformidade com o padrão C++. Se a única razão pela qual você implementa o operador new é delete para oferecer suporte a alocações sobrealinhadas, talvez não precise mais desse código nos modos C++17 ou posterior. Para desativar essa opção e reverter para o comportamento C++14 de new e delete quando você usar /std:c++17 ou posterior, especifique /Zc:alignedNew-. Se você implementar o operador new e não estiver pronto para implementar o operador delete sobrealinhado e new as sobrecargas que têm o delete parâmetro, use a align_val_t opção para impedir que o compilador e a Biblioteca Padrão gerem chamadas para as sobrecargas sobrealinhadas/Zc:alignedNew-. A /permissive- opção não altera a configuração padrão do /Zc:alignedNew.

O suporte para /Zc:alignedNew está disponível a partir do Visual Studio 2017 versão 15.5.

Exemplo

Este exemplo mostra como operador new e operador delete se comportam quando a /Zc:alignedNew opção é definida.

// 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;
}

Essa saída é típica para compilações de 32 bits. Os valores de ponteiro variam com base em onde seu aplicativo é executado na memória.

unaligned new(4) = 009FD0D0
unaligned sized delete(009FD0D0, 4)
aligned new(256, 256) = 009FE800
aligned sized delete(009FE800, 256, 256)

Para obter informações sobre problemas de conformidade no Visual C++, consulte Comportamento não padrão.

Para definir essa opção de compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir compilador C++ e criar propriedades no Visual Studio.

  2. Selecione a Configuration Properties>C/C++>Command Line página de propriedades.

  3. Modifique a propriedade Opções Adicionais para incluir /Zc:alignedNew ou /Zc:alignedNew- escolha OK.

Ver também

/Zc (Conformidade)