2015-03-04 5 views
-1

У меня есть такая функция;Как сказать gcc не оптимизировать определенную функцию

/* 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 *, и я не думаю, что это имело какое-либо значение.

+2

Перед тем как посмотреть на оптимизацию микроменеджмента, как насчет компиляции всей программы с отключенной оптимизацией ('-O0'), чтобы определить, разрешает ли эта проблема? Если это не так (как и мое предсказание), то оптимизация не является вашей проблемой. –

+1

Обратите также внимание на то, что крайне маловероятно, что GCC выполняет описанную вами оптимизацию. Он не будет переупорядочивать вызовы функций, если это не докажет, что это безопасно (или думает, что это возможно). Скорее всего, он не сможет доказать, что, несмотря на то, что это правда, чем ошибочно полагать, что это может доказать это. –

+1

На самом деле, если ваши имена функций/макросов являются указанием на то, что они на самом деле делают, я могу с уверенностью сказать, что это ваш код, который сломан, а не компилятор. –

ответ

1

Как сказать GCC не для оптимизации конкретной функции

Вы можете использовать optimize атрибут функции для компиляции функции с различными вариантами оптимизации.

От gccdocumentation:

оптимизируют

Атрибут оптимизируют используется для указания того, что функция должна быть составлена ​​с различными вариантами оптимизации, чем указано в командной строке. Аргументы могут быть либо числами, либо строками. Предполагается, что числа являются уровнем оптимизации. Строки, которые начинаются с O, считаются опцией оптимизации, в то время как другие опции предполагается использовать с префикс -f. Вы также можете использовать прагму «#pragma GCC optimize» для настройки параметров оптимизации, которые влияют на более чем одну функцию. Дополнительную информацию о прагме «# прагма GCC optimize» см. В разделе «Специальные функции Pragma».