如何告诉gcc不要优化特定的功能

时间:2015-03-04 21:12:22

标签: c gcc linked-list

我有这样的功能;

/* 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 *,我认为它没有任何区别。

1 个答案:

答案 0 :(得分:1)

如何告诉gcc不要优化特定功能

您可以使用optimize函数属性来编译具有不同优化选项的函数。

来自gcc documentation

  

优化

     

optimize属性用于指定使用与命令行中指定的不同优化选项编译函数。参数可以是数字或字符串。假设数字是优化级别。假设以O开头的字符串是优化选项,而假定其他选项与-f前缀一起使用。您还可以使用'#pragma GCC optimize'编译指示来设置影响多个函数的优化选项。有关'#pragma GCC optimize'编译指示的详细信息,请参阅函数特定选项Pragma。