首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告:从'char *‘转换为'float *’会将所需的对齐方式从1增加到4 [-Wcast-align]

警告:从'char *‘转换为'float *’会将所需的对齐方式从1增加到4 [-Wcast-align]
EN

Stack Overflow用户
提问于 2019-05-22 20:05:32
回答 3查看 341关注 0票数 0

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

代码:

代码语言:javascript
复制
$ cat c.cxx
extern char* get();

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

通向

代码语言:javascript
复制
$ 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(),只需返回std::vector<char>&v[0],根据内部类型,它可能包含字节缓冲区或浮点缓冲区(变体)。

EN

回答 3

Stack Overflow用户

发布于 2019-05-22 20:16:36

我建议不要使用C风格的类型转换,而是倾向于使用reinterpret_cast。这也有一个很好的属性,可以消除警告。

然而,为了恰当地回答你的问题:

由于使用C++20,您可以像这样使用std::assume_aligned

代码语言:javascript
复制
extern char* get();

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

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

代码语言:javascript
复制
extern char* get();

void foo()
{
  float *f = (float*)__builtin_assume_aligned(get(), alignof(float));
}
票数 3
EN

Stack Overflow用户

发布于 2019-05-22 20:11:01

在什么样的条件下?如果它总是返回一个浮动缓冲区,就让它成为一个浮动缓冲区(float* get()),如果有时不是这样,静态装饰器就不会有什么帮助。

如果您知道返回的指针指向一个浮点数,则可以使用reinterpret_cast。如果不是这样,但您仍然想要一个浮点数,则可以使用memcpybit_cast (C++20)。

票数 1
EN

Stack Overflow用户

发布于 2019-05-22 20:18:11

警告只是来自编译器的消息,警告程序员(您)有可疑的东西。在一般情况下,从char *转换为float *可能会导致对齐问题,因此会出现警告。

如果您知道在您的用例中不会出现对齐问题,并且严格的别名也不是问题,那么您可以安全地忽略该警告。请务必在代码中留下注释,以便将来的维护者不必担心该位置的警告。

在再次阅读您的问题的最后一行之后,我不会依赖于使用vector<char>的数据缓冲区来实现这种用途。至少您应该使用vector<float>:根据定义,它可以包含浮点数,并且作为字符数组访问任何类型(这里是数组或浮点数)总是安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56256431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档