有没有办法使用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(),只需返回std::vector<char>的&v[0],根据内部类型,它可能包含字节缓冲区或浮点缓冲区(变体)。
发布于 2019-05-22 20:16:36
我建议不要使用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));
}发布于 2019-05-22 20:11:01
在什么样的条件下?如果它总是返回一个浮动缓冲区,就让它成为一个浮动缓冲区(float* get()),如果有时不是这样,静态装饰器就不会有什么帮助。
如果您知道返回的指针指向一个浮点数,则可以使用reinterpret_cast。如果不是这样,但您仍然想要一个浮点数,则可以使用memcpy或bit_cast (C++20)。
发布于 2019-05-22 20:18:11
警告只是来自编译器的消息,警告程序员(您)有可疑的东西。在一般情况下,从char *转换为float *可能会导致对齐问题,因此会出现警告。
如果您知道在您的用例中不会出现对齐问题,并且严格的别名也不是问题,那么您可以安全地忽略该警告。请务必在代码中留下注释,以便将来的维护者不必担心该位置的警告。
在再次阅读您的问题的最后一行之后,我不会依赖于使用vector<char>的数据缓冲区来实现这种用途。至少您应该使用vector<float>:根据定义,它可以包含浮点数,并且作为字符数组访问任何类型(这里是数组或浮点数)总是安全的。
https://stackoverflow.com/questions/56256431
复制相似问题