【发布时间】:2017-09-22 11:12:21
【问题描述】:
考虑下面的示例。它在标记行出现 gcc 5.4 的段错误时
我用g++ -O3 -std=c++11 编译它。它在指令movaps 处失败,我怀疑它执行未对齐的内存访问。可能是 gcc 为这样一个简单的示例生成了非法代码,还是我遗漏了一些东西?
我在 Intel i5-5200U 上运行它。
#include <vector>
#include <memory>
#include <cstdint>
using namespace std;
__attribute__ ((noinline))
void SerializeTo(const vector<uint64_t>& v, uint8_t* dest) {
for (size_t i = 0; i < v.size(); ++i) {
*reinterpret_cast<uint64_t*>(dest) = v[i]; // Segfaults here.
dest += sizeof(uint64_t);
}
}
int main() {
std::vector<uint64_t> d(64);
unique_ptr<uint8_t[]> tmp(new uint8_t[1024]);
SerializeTo(d, tmp.get() + 6);
return 0;
}
【问题讨论】:
-
你可以用
g++ -S -O2 -fverbose-asm查看生成的代码 -
使用 -O2 不会生成矢量化代码。
-
然后用你想要的任何优化替换
-O2,例如-O3 -march=native -
然后它会出现段错误。我不关注
-
非常感谢@BasileStarynkevitch。我也相信更多的编译器。这就是为什么我在这里寻求建议的原因。你的不是很有帮助:)