小编Jul*_*not的帖子

为什么GCC 6假设数据是16字节对齐的?

(提前抱歉没有设法将我的问题减少到简单的失败测试用例...)

我遇到了升级到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.

c++ gcc glibc memory-alignment gcc6

9
推荐指数
1
解决办法
858
查看次数

这段代码会导致内存泄漏问题吗?

考虑下面的代码,如果我使用这样的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)

c++ visual-c++

2
推荐指数
1
解决办法
187
查看次数

标签 统计

c++ ×2

gcc ×1

gcc6 ×1

glibc ×1

memory-alignment ×1

visual-c++ ×1