Как получить отчетливые результаты в Inck Overflow

Я снова читаю Скотта Мейерса Эффективный C ++ и более конкретно пункт 30 о встраивании.

Поэтому я написал следующее, пытаясь вызвать эту оптимизацию с помощью gcc 4.6.3.

// test.h
class test {
public:

inline int max(int i) { return i > 5 ? 1 : -1; }
int foo(int);

private:
int d;
};

// test.cpp

int test::foo(int i) { return max(i); }

// main.cpp

#include "test.h"
int main(int argc, const char *argv[]) {
test t;
return t.foo(argc);
}

и изготовил соответствующую сборку, используя в качестве альтернативы следующее:

g++ -S -I. test.cpp main.cpp
g++ -finline-functions -S -I. test.cpp main.cpp

Обе команды создали одну и ту же сборку в отношении встроенного метода;
Я вижу как max() тело метода (также имеющее cmpl заявление и соответствующие прыжки) и его вызов из foo(),

Я что-то упускаю ужасно очевидное? Я не могу сказать, что пролистал справочную страницу gcc, но не смог найти ничего подходящего.

Итак, я просто повысил уровень оптимизации до -O3 который имеет встроенные оптимизации по умолчанию, в соответствии с:

g++ -c -Q -O3 --help=optimizers | grep inline
-finline-functions                    [enabled]
-finline-functions-called-once        [enabled]
-finline-small-functions              [enabled]

к сожалению, этот оптимизированный (как и ожидалось) приведенный выше фрагмент кода практически не существует.
max() больше не существует (по крайней мере, как явно помеченный блок сборки) и foo() был сокращен до:

_ZN4test3fooEi:
.LFB7:
.cfi_startproc
rep
ret
.cfi_endproc

что я не могу четко понять в данный момент (и выходит за рамки исследований).

В идеале, то, что я хотел бы видеть, было бы ассемблерным кодом для max() внутри foo() блок.
Есть ли способ (либо с помощью параметров строки cmd, либо с использованием другого (нетривиального?) Фрагмента кода) для получения такого вывода?

2

Решение

Компилятор полностью свободен для встроенных функций, даже если вы не просите об этом — оба, когда вы используете inline ключевое слово или нет, или вы используете -finline-functions или нет (хотя, вероятно, нет, если вы используете -fnoinline-functions — это будет противоречить тому, что вы просили, и хотя стандарт C ++ не говорит об этом, флаг становится довольно бессмысленным, если он не делает что-то вроде того, что он говорит).

Далее, компилятор также не всегда уверен, что ваша функция не будет использоваться «где-то еще», поэтому он создаст внеплановую копию большинства встроенных функций, если не совсем ясно, что она «не может быть вызвана». откуда-то еще [например, класс объявлен так, что он не может быть достигнут в другом месте].

И если вы не используете результат функции, и у функции нет побочных эффектов (например, запись в глобальную переменную, выполнение ввода-вывода или вызов функции, то компилятор «не знает, что он делает»). ), то компилятор исключит этот код как «мертвый» — ведь вы действительно не хотите ненужного кода, не так ли? Добавление return перед max(i) в вашем foo функция должна помочь.

3

Другие решения


По вопросам рекламы [email protected]