std::align 不受 G++4.9 支持
std::align not supported by g++4.9
在学习对齐问题等时,我意识到我的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 );
}
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 将 IPv6 支持添加到雨量计
- 为什么C++不支持对未初始化变量进行智能分析?
- LMDB 是否支持随机读取?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错