Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir compilador C++ e criar propriedades no Visual Studio.
Selecione a Configuration Properties>C/C++>Command Line página de propriedades.
Modifique a propriedade Opções Adicionais para incluir
/Zc:alignedNewou/Zc:alignedNew-escolha OK.