首页 > 解决方案 > 警告:从 'char *' 转换为 'float *' 将所需对齐从 1 增加到 4 [-Wcast-align]

问题描述

有没有办法让我使用 c++11 关键字alignas来装饰函数get()。在某些情况下,我知道返回的缓冲区get()将包含正确对齐的浮点缓冲区。

代码:

$ cat c.cxx
extern char* get();

void foo()
{
  float *f = (float*)get();
}

导致

$ clang++-8 -Wcast-align -c c.cxx
c.cxx:5:14: warning: cast from 'char *' to 'float *' increases required alignment from 1 to 4 [-Wcast-align]
  float *f = (float*)get();
             ^~~~~~~~~~~~~
1 warning generated.

对于函数的引用char* get(),只需返回&v[0]一个std::vector<char>取决于内部类型的可能包含字节缓冲区或浮点缓冲区(变体)的。

标签: c++c++11

解决方案


我建议不要使用 C 风格的演员表,reinterpret_cast而是偏爱。这也有摆脱警告的好特性。

但是,要正确回答您的问题:

从 C++20 开始,您可以std::assume_aligned像这样使用:

extern char* get();

void foo()
{
  float *f = (float*)std::assume_aligned<alignof(float)>(get());
}

在 C++20 之前,您还可以使用不可移植的编译器内在函数:

extern char* get();

void foo()
{
  float *f = (float*)__builtin_assume_aligned(get(), alignof(float));
}

推荐阅读