在学习对齐问题等时,我意识到我的g++4.9 (macports )的实现不支持std::align。如果我试图(用-std=c++11)从http://www.cplusplus.com/reference/memory/align/编译这个示例代码
// align example
#include <iostream>
#include <memory>
int main() {
char buffer[] = "------------------------";
void * pt = buffer;
std::size_t space = sizeof(buffer) - 1;
while ( std::align(alignof(int), sizeof(char), pt, space) ) {
char* temp = static_cast<char*>(pt);
*temp = '*'; ++temp; space -= sizeof(char);
pt = temp;
}
std::cout << buffer << '\n';
return 0;
}编译器将输出错误。
error: 'align' is not a member of 'std'这似乎很奇怪,因为g++似乎实现了自g++4.8,https://gcc.gnu.org/projects/cxx0x.html (N2341)以来对对齐的支持。
代码在clang++下编译,没有任何问题。
这是我不知道的g++的一个众所周知的问题吗?我测试的在线编译器(ideone和coliru)也拒绝代码。
发布于 2014-11-21 15:35:18
是的,对于gcc来说,这是一个已知的缺失特征:
std::align失踪发布于 2016-06-07 12:13:01
作为另一种选择,您可以编写与std::align行为相匹配的自己的对齐代码。下一段代码是由David在以下文章中编写的:bug.cgi?id=57350
inline void *align( std::size_t alignment, std::size_t size,
void *&ptr, std::size_t &space ) {
std::uintptr_t pn = reinterpret_cast< std::uintptr_t >( ptr );
std::uintptr_t aligned = ( pn + alignment - 1 ) & - alignment;
std::size_t padding = aligned - pn;
if ( space < size + padding ) return nullptr;
space -= padding;
return ptr = reinterpret_cast< void * >( aligned );
}https://stackoverflow.com/questions/27064791
复制相似问题