I am trying to compile a code in C++, that uses over-aligned variables. If I try to compile the following code (a 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; }
everything runs smoothly if I use icpx
or g++
(in all the cases, the flag -std=c++17
is given to the compiler). However, when compiling using Intel icpc
, I got the following 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)
and I do not understand what the error can be. How can I solve this issue?
Advertisement
Answer
It seems that icpc fails to conform with the standard with aligned allocations. Quoting from the documentations for version 2021.5:
In this release of the compiler, all that is necessary in order to get correct dynamic allocation for aligned data is to include a new header:
#include <aligned_new>
After this header is included, a new-expression for any aligned type will automatically allocate memory with the alignment of that type.
Live demo: https://godbolt.org/z/5xMqKGrTG
This section is missing in the documentation of icpx: https://www.intel.com/content/www/us/en/develop/documentation/oneapi-dpcpp-cpp-compiler-dev-guide-and-reference/top.html.