Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

icpc error in compiling over-aligned dynamic allocated variables

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?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

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.

Link: https://www.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/optimization-and-programming-guide/automatically-aligned-dynamic-allocation/automatically-aligned-dynamic-allocation-1.html

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.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading