Sir*_*Guy 7 c++ language-lawyer c++11
N3797 26.4 [complex.numbers]说这是关于铸造std::complex<T>*的T*
4此外,如果a是类型的表达式,
cv std::complex<T>*并且表达式a[i]是为整数表达式定义的i,那么:
-reinterpret_cast<cv T*>(a)[2*i]应指定的实部a[i],并且
-reinterpret_cast<cv T*>(a)[2*i + 1]应指定虚部a[i].
这个(或标准的其他措辞)是否意味着我可以reinterpret_cast反过来?我可以这样做:
float * pf;
std::complex<float>* pc = reinterpret_cast<std::complex<float>*>(pf);
pc[i].real();
Run Code Online (Sandbox Code Playgroud)
正如nm指出的那样,我必须确保对齐pf适合a std::complex<float>.可以假设这是照顾的.
不,该条款不提供此类保证。
现在,在实践中,最常见的问题是对齐:但即使这样也可能很少见。
第二个问题涉及严格的别名,其中double编译器可以假设分配为 a 的内存不会被任何涉及指向其他类型的指针(除char)的操作所修改。上面放置了一个相反的限制(complex分配的指针可能不会假设double*不指向它的数据),但不是您想要的方向。同样,这相对晦涩难懂,但编译器可以使用它来重新排序代码中的写入。
然而,它通常会起作用。更常见的是,如果您对齐它,并且您的编译器不使用严格的别名假设:但是,即使如此,它也是标准未定义的行为。
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |