#40315: c++17 std::aligned_alloc Open Date: 2020-04-10 05:55 Last Update: 2020-04-13 12:03 URL for this Ticket: https://osdn.net//projects/mingw/ticket/40315 RSS feed for this Ticket: https://osdn.net/ticket/ticket_rss.php?group_id=3917&tid=40315 --------------------------------------------------------------------- Last Changes/Comment on this Ticket: 2020-04-13 12:03 Updated by: keith Comment: FWIW, as a trivial example, the following foo.cc works: 1. #include <cstdio> 2. #include <cstdlib> 3. 4. #if __cplusplus >= 201703L && defined __MINGW32__ 5. #include <malloc.h> 6. 7. #undef free 8. #define free aligned_free 9. 10. extern "C" 11. { static inline __attribute__((__always_inline__)) 12. void *aligned_alloc( size_t align, size_t wanted ) 13. { return __mingw_aligned_offset_malloc( wanted, align, (size_t)(0) ); } 14. 15. static inline __attribute__((__always_inline__)) 16. void aligned_free( void *ptr ){ return __mingw_free( ptr ); } 17. } 18. 19. namespace std 20. { using ::aligned_alloc; 21. using ::aligned_free; 22. } 23. #endif // C++17 && __MINGW32__ 24. 25. int main() 26. { int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1)); 27. std::printf("default-aligned address: %p\n", static_cast<void*>(p1)); 28. std::free(p1); 29. 30. int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024)); 31. std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2)); 32. std::free(p2); 33. } When cross-compiled, on my GNU/Linux host, and subsequently run under wine, this produces output similar to: $ mingw32-g++ -std=gnu++17 foo.cc $ ./a.exe default-aligned address: 00230F70 1024-byte aligned address: 00231400 Unfortunately, for more general application, the above is intrinsically unsafe. The problem is that, while __mingw_aligned_offset_malloc(), (in terms of which aligned_alloc() is implemented), returns a pointer to heap memory, that pointer is incompatible with Microsoft's realloc() and free() functions; thus, if that pointer were to be passed to any (third party) function, which might then pass it to realloc(), or to free(), the behaviour would be undefined. (Of course, the same criticism could be levelled at Microsoft's own over-aligned heap allocation functions, each of which also returns a pointer to heap memory, and which in turn, is equally incompatible with their realloc() and free() functions). --------------------------------------------------------------------- Ticket Status: Reporter: drakbar Owner: (None) Type: Issues Status: Open Priority: 5 - Medium MileStone: (None) Component: GCC Severity: 5 - Medium Resolution: None --------------------------------------------------------------------- Ticket details: According to cppreference, the function std::aligned_alloc is apart of C++17. When trying to compile the example code found at that page, the following compilation error occurs: src code 1. #include <cstdio> 2. #include <cstdlib> 3. 4. int main() 5. { 6. int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1)); 7. std::printf("default-aligned address: %p\n", static_cast<void*>(p1)); 8. std::free(p1); 9. 10. int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024)); 11. std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2)); 12. std::free(p2); 13. } compilation output $g++ -std=c++17 alignment.cpp -o main alignment.cpp: In function 'int main()': alignment.cpp:10:38: error: 'aligned_alloc' is not a member of 'std' 10 | int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024)); gcc version Target: x86_64-w64-mingw32 Configured with: ../gcc-9.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld Thread model: posix gcc version 9.3.0 (Rev1, Built by MSYS2 project) platform Windows 10 Build: 18362.720 linker version GNU ld (GNU Binutils) 2.34 mingw version not quite sure which number is the relevant one in _mingw.h ?? build environment I have tested using both windows command prompt and the msys-w64 shell, and both yield the same result MINGW64_NT-10.0-18362 3.0.7-338.x86_64 2019-07-11 10:58 UTC x86_64 Msys -- Ticket information of MinGW - Minimalist GNU for Windows project MinGW - Minimalist GNU for Windows Project is hosted on OSDN Project URL: https://osdn.net/projects/mingw/ OSDN: https://osdn.net URL for this Ticket: https://osdn.net/projects/mingw/ticket/40315 RSS feed for this Ticket: https://osdn.net/ticket/ticket_rss.php?group_id=3917&tid=40315