(提前抱歉没有设法将我的问题减少到简单的失败测试用例...)
我遇到了升级到GCC 6.3.0以构建我们的代码库(相关标志:)的问题-O3 -m32.
具体来说,由于GCC优化,我的应用程序会在struct ctor调用中进行段错误.
在这个ctor中,GCC使用了movaps:
movaps %xmm0,0x30a0(%ebx)
Run Code Online (Sandbox Code Playgroud)
movaps 要求操作数为16字节对齐.但是在这个时间%ebx点,指向我的对象,不一定是16字节对齐.来自glibc:
"在GNU系统中,malloc或realloc返回的块的地址总是八的倍数(或64位系统上的十六个)."
因此segfault(建立时-O3 -m32).
为什么GCC假设分配的对象是16字节对齐?我误会了什么吗?
笔记:
new运算符初始化-m32 -O2-m32 -O2 -ftree-slp-vectorize-m32 -O3 -fno-tree-slp-vectorize-m32 -O3这个其他项目似乎遇到了类似的问题:https://github.com/godotengine/godot/issues/4623
他们的调查指向-fvect-cost-model=dynamic.调查我的代码库而不是指向-ftree-slp-vectorize.
考虑下面的代码,如果我使用这样的Die类实例会发生什么:
Die d;
d.Roll(20);
d.Roll(15);
d.Roll(30);
Run Code Online (Sandbox Code Playgroud)
在为内存再次分配内存之前,我应该还是不应该释放值占用的内存?delete[ ]之前new?
die.h
#ifndef DIE_H
#define DIE_H
#include<iostream>
#include<time.h>
using namespace std;
class Die
{
private:
int number;
int* values;
int count;
void roll();
public:
Die(){srand(static_cast<int>(time(NULL)));number=0;values=NULL;count=0;}
void Roll(int n);
int getNumber()const{return number;}
void printLastValue();
void printValues();
~Die(){delete [] values;}
};
#endif
Run Code Online (Sandbox Code Playgroud)
die.cpp
#include"die.h"
#include<iostream>
#include<time.h>
using namespace std;
void Die::roll()
{
number=1+rand()%6;
}
void Die::printLastValue()
{
cout<<number<<endl;
}
void Die::Roll(int n)
{
count=n;
values=new int[count];
for(int i=0;i<count;i++)
{ …Run Code Online (Sandbox Code Playgroud)