gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:37:07 24 4
gpt4 key购买 nike

调试优化代码似乎是不可能的。我花了太长时间试图超越编译器。由于编译器优化我的代码,我很难做一个简单的检查我的结构是否为空,不要误会我的意思我确实想保留 -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;
}

此处供引用的是 Dequeue 函数和结构:

LogArgs* Dequeue(){
LogArgs* largs;

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

结构如下:

typedef struct {
time_t *rawtime;
char event[129];
} LogArgs;

有什么方法可以防止 largs 被优化掉吗?

最佳答案

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

尝试 -Og (自 gcc 4.8 起)。那应该启用不干扰调试的优化。

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

关于c - 使用 -O3 选项优化结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31305690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com