【发布时间】:2017-06-01 23:37:19
【问题描述】:
这个小代码 sn-p 使用 g++ 6.2.0 和 clang++ 3.8.1 出现段错误:
clang++ -std=c++11 -O3 -mavx -pthread 或 g++ -std=c++11 -O3 -mavx -pthread
#include <thread>
#include <iostream>
class alignas(32) AlignedObject {
public:
float dummy[8];
};
int main() {
while (true) {
std::thread([](){
AlignedObject x;
std::cout << &x;
std::thread([x](){
std::cout << &x;
}).join();
}).join();
}
return 0;
}
查看反汇编,两个编译器都插入了失败的vmovaps 指令,这表明编译器生成的对象在某处没有正确对齐。如果 -mavx 被删除,它会正常工作,因为该指令不再被使用。这是编译器错误还是此代码依赖于未定义的行为?
【问题讨论】:
标签: c++ c++11 lambda memory-alignment avx