Estoy tratando de compilar un código en C++, que usa variables sobrealineadas. Si trato de compilar el siguiente código (un MWE)
#include <new> #include <iostream> int main() { alignas(32) double *r = new (std::align_val_t{32}) double[3]; std::cout << "alignof(r) is " << alignof(r) << '\n'; return 0; } todo funciona sin problemas si uso icpx o g++ (en todos los casos, el indicador -std=c++17 se le da al compilador). Sin embargo, al compilar usando Intel icpc , recibí el siguiente error
mwe.cpp(6): error: no instance of overloaded "operator new[]" matches the argument list argument types are: (unsigned long, std::align_val_t) alignas(32) double *r = new (std::align_val_t{32}) double[3]; ^ /usr/include/c++/9/new(175): note: this candidate was rejected because arguments do not match _GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT ^ /usr/include/c++/9/new(141): note: this candidate was rejected because arguments do not match _GLIBCXX_NODISCARD void* operator new[](std::size_t, const std::nothrow_t&) _GLIBCXX_USE_NOEXCEPT ^ /usr/include/c++/9/new(127): note: this candidate was rejected because mismatch in count of arguments _GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) ^ mwe.cpp(7): warning #3464: the standard "alignof" operator does not accept an expression argument (use a type instead) std::cout << "alignof(r) is " << alignof(r) << '\n'; ^ compilation aborted for mwe.cpp (code 2)y no entiendo cual puede ser el error. ¿Cómo puedo solucionar este problema?
Parece que el icpc no cumple con el estándar con asignaciones alineadas. Citando de la documentación para la versión 2021.5:
En esta versión del compilador, todo lo que se necesita para obtener la asignación dinámica correcta para los datos alineados es incluir un nuevo encabezado :
#include <aligned_new>Después de incluir este encabezado, una nueva expresión para cualquier tipo alineado asignará automáticamente memoria con la alineación de ese tipo.
Demostración en vivo: https://godbolt.org/z/5xMqKGrTG
Esta sección no se encuentra en la documentación de icpx: https://www.intel.com/content/www/us/en/develop/documentation/oneapi-dpcpp-cpp-compiler-dev-guide-and-reference/top. html