У меня есть такая функция;Как сказать 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 *, и я не думаю, что это имело какое-либо значение.
Перед тем как посмотреть на оптимизацию микроменеджмента, как насчет компиляции всей программы с отключенной оптимизацией ('-O0'), чтобы определить, разрешает ли эта проблема? Если это не так (как и мое предсказание), то оптимизация не является вашей проблемой. –
Обратите также внимание на то, что крайне маловероятно, что GCC выполняет описанную вами оптимизацию. Он не будет переупорядочивать вызовы функций, если это не докажет, что это безопасно (или думает, что это возможно). Скорее всего, он не сможет доказать, что, несмотря на то, что это правда, чем ошибочно полагать, что это может доказать это. –
На самом деле, если ваши имена функций/макросов являются указанием на то, что они на самом деле делают, я могу с уверенностью сказать, что это ваш код, который сломан, а не компилятор. –