mam*_*sun 6 c++ optimization gcc segmentation-fault
我将我的问题总结为以下简短程序.
它仅在-O3模式下导致SEGFAULT(-O2工作正常).根据gdb它发生*f = 0在线.
#include <iostream>
void func1(int s, int t)
{
char* buffer = new char[s + t*sizeof(float)];
if (!buffer)
{
std::cout << "new failed\n";
return;
}
float* f = (float*)(buffer + s);
for (int i = 0; i < t; ++i)
{
*f = 0;
//std::cout << i << std::endl; // if uncomment this line everything will work fine
++f;
}
delete [] buffer;
std::cout << "done\n";
}
int main()
{
int s = 31, t = 12423138;
std::cout << s << " " << t << std::endl;
func1(s, t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请让我知道,我做错了什么?
SEGFAULT 的来源不仅仅是违反了严格的别名规则,因为即使使用 -fno-strict-aliasing 标志,问题仍然存在。
它确实访问了未对齐的内存,但并不那么简单。作为现代处理器,通常允许未对齐的内存访问,并且现在甚至没有太多开销。我已经做了一些基准测试,并没有观察到我的 Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz 上的 algined 与未对齐读取有很大差异。网络上也有一些非常相似的(或多或少是最近的)结果。
我的问题是-O3模式启用-ftree-vectorize标志,因此我的for周期被矢量化(正如我使用-ftree-vectorizer-verbose标志所看到的)。而且(AFAIU)还不支持使用向量化指令进行未对齐的内存访问,因此存在运行时异常。
这篇文章对我理解理论有很大帮助,尽管今天看来,未对齐的内存访问并不像以前那样有害,但仍然很棘手
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |