C++ std::align不受g+支持+;4.9

C++ std::align不受g+支持+;4.9,c++,c++11,alignment,C++,C++11,Alignment,在学习对齐问题等时,我意识到我的g++4.9(macports OS X)实现不支持std::align。如果我尝试编译(使用-std=c++11)以下示例代码 这似乎很奇怪,因为g++似乎从g++4.8(N2341)开始就实现了对齐支持 代码在clang++下编译,没有任何问题 这是我不知道的g++的一个众所周知的问题吗?我测试的在线编译器(ideone和coliru)也拒绝使用该代码。是的,这是gcc已知缺少的功能: :std::align缺失 作为替代方案,您可以编写与std::alig

在学习对齐问题等时,我意识到我的g++4.9(macports OS X)实现不支持
std::align
。如果我尝试编译(使用
-std=c++11
)以下示例代码

这似乎很奇怪,因为g++似乎从g++4.8(N2341)开始就实现了对齐支持

代码在clang++下编译,没有任何问题


这是我不知道的g++的一个众所周知的问题吗?我测试的在线编译器(ideone和coliru)也拒绝使用该代码。

是的,这是gcc已知缺少的功能:

  • std::align
    缺失

作为替代方案,您可以编写与
std::align
行为相匹配的对齐代码。下一段代码由David Krauss在此处的帖子中编写:

inline void*align(std::size\u t align,std::size\u t size,
空隙*&ptr,标准::尺寸(单位和空间){
std::uintptr\u t pn=重新解释铸件(ptr);
std::uintpttr_t aligned=(pn+校准-1)和-校准;
std::size\u t padding=对齐-pn;
if(空格<大小+填充)返回nullptr;
空间-=填充;
返回ptr=重新解释铸件(对齐);
}

谢谢你的链接,只是看到它在g++4.9 trunk中没有出现,尽管这个错误是在一年多前报告的。@vsoftco,“g++4.9 trunk”没有意义。没有“g++4.9主干”。有4.9分支,还有主干,这是一个不同的分支。修好了后备箱。bug报告中的目标里程碑字段表示它将位于GCC 5中。0@JonathanWakely最后得到了:)注意这行
autonew\u space=space-(aligned-pn)是潜在的无符号下溢。上面提到的链接也提供了正确的版本。
// 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'
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 );
}