std::align 不受 G++4.9 支持

std::align not supported by g++4.9

本文关键字:支持 G++4 不受 align std      更新时间:2023-10-16

在学习对齐问题等时,我意识到我的g++4.9(macports OS X)的实现不支持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)也拒绝代码。

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

  • 错误 53814:缺少std::align

作为替代方案,您可以编写自己的对齐代码来匹配std::align的行为。下一段代码是由David Krauss在这里找到的一篇文章中编写的:https://gcc.gnu.org/bugzilla/show_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 );
}