我有这样的功能;
/* Swap two element by address*/
static __inline void dllist_swap_byaddress(void *elem1, void *elem2) {
/*
Modify pointers to swap order of elements. Consider swapping by value
if data to be swapped is smaller than 8 bytes or so.
*/
void *elem1_prev = dllist_getprev(elem1);
void *elem1_next = dllist_getnext(elem1);
void *elem2_prev = dllist_getprev(elem2);
void *elem2_next = dllist_getnext(elem2);
__dllist_setnext(elem2_prev, elem1);
__dllist_setnext(elem1_prev, elem2);
__dllist_setnext(elem1, elem2_next);
__dllist_setnext(elem2, elem1_next);
}
但是,它没有按预期工作。我猜(我不知道如何验证它),gcc将我的代码优化为:
__dllist_setnext(dllist_getprev(elem2), elem1);
__dllist_setnext(dllist_getprev(elem1), elem2);
__dllist_setnext(elem1, dllist_getnext(elem2));
__dllist_setnext(elem2, dllist_getnext(elem1));
但是,我不希望发生这种情况,因为例如__dllist_setnext(dllist_getprev(elem2), elem1)
也会改变dllist_getprev(elem1)
的值。这就是我试图首先将它们保存在本地堆栈中的全部原因。
我如何验证gcc是否真的这样做,如果确实如此,我怎么能告诉它停止这样做?
我试图让void *
变得不稳定,但在调用函数之前我必须再次将它们转换为void *,我认为它没有任何区别。
答案 0 :(得分:1)
如何告诉gcc不要优化特定功能
您可以使用optimize
函数属性来编译具有不同优化选项的函数。
来自gcc
documentation:
优化
optimize属性用于指定使用与命令行中指定的不同优化选项编译函数。参数可以是数字或字符串。假设数字是优化级别。假设以O开头的字符串是优化选项,而假定其他选项与-f前缀一起使用。您还可以使用'#pragma GCC optimize'编译指示来设置影响多个函数的优化选项。有关'#pragma GCC optimize'编译指示的详细信息,请参阅函数特定选项Pragma。