Форум программистов, компьютерный форум CyberForum.ru

Что делает компилятор с этим? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ В каждой строке текстового файла найти самую длинную последовательность цифр http://www.cyberforum.ru/cpp-beginners/thread1208828.html
В каждой строке текстового файла найти самую длинную последовательность цифр. значение ее длины превратить в строку, записать в начале строки исходного файла. Результаты записать в новый файл. -------------------- помогите сделать нужно на завтра. Мучаюсь 3 день на ней.
C++ Ошибка базового класса строки Есть код и есть ошибки в mystring.cpp, помогите пожалуйста исправить :help: /*----------------/ mystring.h /---------------*/ #ifndef MYSTRING_H #define MYSTRING_H http://www.cyberforum.ru/cpp-beginners/thread1208822.html
C++ программист С++ удалёнка - реально ли?
Ненмого не по теме, но не нашёл более подходящей темы. Вообщем многие из знакомых веб-программисты работают удалённо, 1 вообще живёт при этом на Бали, но поскольку я работаюв другой области и с железом, то мне понятное дело сидеть в офисе...Вот интересно, программисты С++,Java,С# часто ли работаю по удалёнке и при этом имеют неплохой доход(для меня это от 50т.р. СПБ). Фриланс с лабами итп не в...
C++ Запрограммировать на языке С
1.Пользователь вводит два натуральных числа m; n. Заполнить поле m n звёздочками в шахматном порядке 2.Проверить является ли введённое пользователем число палиндромом
C++ Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами http://www.cyberforum.ru/cpp-beginners/thread1208814.html
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.
C++ Cannot convert 'wchar_t *' to 'const char *' Всем привет, не могу понять почему не работает :( String s=StringReplace(s, String(char(92)),String(char(92))+String(char(92)),TReplaceFlags()<<rfReplaceAll); char *device; device = s; Получаю: " Cannot convert 'UnicodeString' to 'char *' " device = s.c_str(); Получаю: "Cannot convert 'wchar_t *' to 'char *'" device = s.t_str(); подробнее

Показать сообщение отдельно
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
15.06.2014, 23:33     Что делает компилятор с этим?
Вот это поворот) С функциями я уже сказал, что всё хранится в стеке - так оно и есть, об этом говорит Страуструп, MSDN и несколько других источников, что подтверждается путем отладки и проверки адресов (в дизассемблированном виде не смотрел). А вот с временными объектами вычислений всё намного круче)
Я очень много протестировал различных примеров, приведу самый простой и понятный:
C++
1
_tt = _t * _tt - _tt;
где __t и _t - объекты типа int, в которые динамически заносятся значения (в момент выполнения считываются с потока ввода).
И что же мы видим?
Assembler
1
2
3
4
mov     edx, [ebp+var_4]
imul    edx, [ebp+var_8]
sub     edx, [ebp+var_8]
mov     [ebp+var_8], edx
Откуда видно, что временный объект хранится в регистре; не в памяти, не в стеке, а в регистре!
Тот же пример, но с типом double:
Assembler
1
2
3
4
fld     [ebp+var_8]
fmul    [ebp+var_10]
fsub    [ebp+var_10]
fstp    [ebp+var_10]
Кратко поясню: при работе с вещественными числами используется FPU. Для правильной работы FPU предоставляется некоторый стек (который в языке ассемблера также предоставляется в виде специальных регистров R0-R7, а сам стек рассматривается как ST-ST(7); доступ к ним напрямую закрыт, но возможен через mm0-mm7 (расширение MMX) бла бла...). Так вот этот самый стек и используется при работе с double.
Подводя итог, можно выделить следующее:
  • возвращаемые значения функций передаются через стек (в асме не проверено)
  • целые числа, целиком влезающие в регистры, помещаются в регистры
  • вещественный тип работает через стек FPU
Ещё разок: всё вышеизложенное относится к временным объектам, которые программистом напрямую не контролируются. Также, возможно, целые числа sizeof() > 4 байт на 32-битных процессорах помещаются в стек (я не проверил) или работают через пары регистров, например edx, eax.

Добавлено через 8 минут
И ещё кое-что: не рассматриваю в данном случае передачу возвращаемого значения функции через eax, иначе как же можно завести нечто следующее:
C++
1
const int& ref = foo();
Где foo:
C++
1
2
3
const int& foo();
// или
int foo();
Не знаю как это назвать тогда - ссылка на регистр? Конечно, понятно, что в таких случаях код транслируется по-разному, но просто я это не учитывал)
 
Текущее время: 02:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru