Объявление ссылки - это обычная инструкция или просто второе имя? - PullRequest
0 голосов
/ 01 августа 2011

Когда я пишу,

T &t = obj;

Это считается инструкцией (которая генерирует машинный код) или просто вторым именем obj?

Ответы [ 4 ]

6 голосов
/ 01 августа 2011

Я не думаю, что стандарт когда-либо использует слово инструкция, за исключением сгенерированного кода. Строка T &t = obj; является оператором объявления, который является определением; это утверждение, но такие вещи, как using std::string;. Это может или не может привести к генерации исполняемого кода, в зависимости от многих вещей.

Также (из-за вашего названия): в T &t = obj;.

нет назначения.
5 голосов
/ 01 августа 2011

Это зависит.Если оптимизатор может полностью исключить T, машинный код не будет сгенерирован.В противном случае, вероятно, будет.

Если вы действительно заботитесь об ответе для некоторого конкретного фрагмента кода, скомпилируйте код, как обычно (тот же компилятор, те же опции оптимизации и т. Д.), Но заставьте компилятор произвестикод сборки.Затем изучите код сборки, чтобы узнать ответ.

2 голосов
/ 01 августа 2011

Как говорит Джеймс, генерация кода не является частью языкового стандарта, поэтому в контексте языка нет ответа.

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

Типичные примеры, которые почти наверняка не вызывают генерацию дополнительного кода:

int a = 2875;
char * const pa = reinterpret_cast<char*>(&a); // no code
int & ra = a;                                  // no code

double arr[10];
double & rd = arr[5];                          // no code

std::map<int, std::string> m;
const std::string & s = m.find(8)->second;     // ? ... ->
return foo(s);                                 // ... -> probably no code for s
0 голосов
/ 01 августа 2011

Генерирует машинный код. T будет принимать эффективный адрес объекта. Вы можете настроить свой компилятор на генерацию сборки и проверить это самостоятельно. На Windows это то, что генерируется:

lea eax, DWORD PTR _obj $ [ebp]
mov DWORD PTR _t $ [ebp], eax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...