为什么在使用clang(3.4)编译时使用gcc编译时,以下代码运行正常但是段错误。如果删除了明显多余的Thread对象,则代码运行正常。此外,如果任何数组变得更小,代码运行正常。
#include <array>
#include <emmintrin.h>
class Thread {
public:
std::array<__m128i, 16 * 3 * 3 * 1280> m_BlockTypes;
unsigned int m_SeedIdx1[16 * 16 * 3 * 3 * 512];
};
class BroadcastImpl
{
public:
std::array<__m128i, 16 * 3 * 3 * 256> Evaluate()
{
return std::array<__m128i, 16 * 3 * 3 * 256>();
}
};
int main(int argc, char** argv) {
Thread thread;
(void)(thread);
BroadcastImpl().Evaluate();
BroadcastImpl().Evaluate();
}
答案 0 :(得分:3)
好吧,你要在堆栈上分配两个巨大的数组。最大堆栈大小不是由C ++标准定义的(编译器在那里选择它们自己的限制),但是超过那个最大值并且东西会中断。
应该在堆上分配大型数组,这意味着std::vector
是比std::array
更好的选择(尽管如果你真的想要,你可以动态分配std::array
)。你当然不应该从函数返回那个大小的数组,至少不要读取move-constructors。
答案 1 :(得分:0)
这似乎是堆栈溢出。我的猜测是clang的默认堆栈大小与g ++不同。尝试在两个链接器中手动将堆栈大小设置为相同的大小。