结构指针使用-O3选项进行优化

Lin*_*nus 0 c optimization struct

调试优化代码似乎是不可能的.我花了太长时间试图超越编译器.由于编译器优化了我的代码,我很难做一个简单的检查,如果我的struct是否为null,请不要误解我的意思是我想保留-O3选项,如果可能的话加速我的代码,但是如果由于编译器优化,我不断收到很多错误,我可能会把它关掉.

我有一个线程,它将尝试从数组中将结构条目出列并将它们放入数据库中但由于某种原因结构已经过优化.

void *queue_func(void *param){
    LogArgs* largs;
    pthread_mutex_t *mx = (pthread_mutex_t*) param;

    InitQueue();
    while(!needQuit(mx)){
        if((largs = Dequeue()) != NULL){ // the boolean result is true here
            interrupt_log(largs->event, largs->rawtime); // yet largs is NULL here!!!
        }
        usleep(50000);
    }
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

这里参考的是Dequeue函数和struct:

LogArgs* Dequeue(){
    LogArgs* largs;

    if(isEmpty()) return NULL;
    else{
        largs = &queue[++head % MAX_SIZE];
        return largs;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是结构:

typedef struct {
    time_t *rawtime;
    char event[129];
} LogArgs;
Run Code Online (Sandbox Code Playgroud)

有没有办法防止拉格斯被优化?

too*_*ite 5

完全优化的调试 - 正如您已经注意到的那样 - 只是一种痛苦.并且使用volatile等等也没有多大帮助,完全禁用优化甚至可能更快,因为volatile禁止编译器将变量放入寄存器(例如).

尝试-Og(自gcc 4.8).这应该能够实现不干扰调试的优化.

如果两个线程之间有数据结构,必须告诉编译器它们是特殊的.但是,对于具有高速缓存等的现代多CPU系统,volatile应用程序层代码几乎没有用处.使用原子类型(stdatomic.h) - 完全支持自gcc 4.9.这些包括障碍(aka围栏),以保证访问的正确排序.