c++ - 警告:从 '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 风格的演员表,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));
}
推荐阅读
- python - 从另一个列表中删除所有项目的有效方法
- java - 编写单元测试以检查方法未返回的变量
- python - 如何将此函数转换为异步生成器
- java - 如何让 Scanner 和 Timer 同时运行
- javascript - 在范围内创建、设置样式
- python - 如何在一个数字中找到最大和连续增加的数字
- excel - 如何知道发生了警报弹出窗口
- c# - 在 C# 中用一行写一个列表
- azure - 使用 Terrafrom 获取 Azure Databricks URL
- amazon-web-services - 在 Terraform 中仅将 AWS Aurora 引擎版本指定为主要版本号