![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]() |
![]() |
![]() |
![]() |
#12 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]() |
![]() |
![]() |
![]() |
#13 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]()
Набросал небольшой тест, думаю он все достаточно просто объясняет. Идея следующая: в цикле пробегаем по массиву s и каждый проход суммируем в i.
Компилятор выбирает два способа построить код: 1. копить сумму в регистре, а сброс в память сделать при выходе из него. 2. на каждой итерации делать сброс в память. Вывод можно сделать не только о циклах, но и взаимоотношениях указателей различных типов в целом. Следует обратить внимание на взаиморасположение "!!! Сброс *i из регистра в память" и "!!! конец цикла". g++ 1.cpp -O2 -S : Код:
Последний раз редактировалось 220Volt; 01.09.2014 в 00:30. |
![]() |
![]() |
![]() |
#14 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]()
По идее, так тоже можно:
Код:
|
![]() |
![]() |
![]() |
#15 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
![]()
Ну... забавно конечно, но я стараюсь писать как можно более простой и понятный код. Чтобы другим в нем можно было разобраться тоже.
Лично я считаю, что если в коде есть reinterpret_cast, то с большой вероятностью, что-то где-то не так. Нужно как минимум попробовать от него избавиться. Ну а если оно еще и кастуется в неправильный тип - то ваще... Ваши примеры с юнионом я не понял. Точнее, не понял почему компилятор не может из юниона выкидывать неиспользуемые поля. Я думаю может и никакой опасности это не несет. |
![]() |
![]() |
![]() |
#16 | |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]() Цитата:
Код:
Последний раз редактировалось 220Volt; 01.09.2014 в 05:28. |
|
![]() |
![]() |
![]() |
#17 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,372
|
![]() |
![]() |
![]() |
![]() |
#18 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]()
Использовал placement new, ну а полученный буфер кастовл.
|
![]() |
![]() |
![]() |
#19 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]() Код:
|
![]() |
![]() |
![]() |
#20 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
![]()
Например, код:
Код:
Правила мы нарушаем, это ясно, интересует - как это сделать грамотно? Чего я опасаюсь? Такого сценария: 1. Выполняем первый алгоритм 2. В регистрах, после первого алгоритма, что-то остаётся (сброс в память не выполнен). 3. Выполняем второй алгоритм. Нужна гарантия того, что после первого алгоритма все операции по записи из регистров завершены. Когда такие гарантии, с точки зрения стандарта, имеются? |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
С++ not implemented in type 'istream' for arguments of type 'float *'из-за чего эта ошибка и как исправить? | Mitax-47 | Помощь студентам | 1 | 10.05.2013 15:48 |
Could not convert variant of the type (String) into type (Boolean) | Silly Student | C++ Builder | 0 | 19.11.2011 13:06 |
Отличие type T = Object от type T = Class? | Warn | Общие вопросы Delphi | 8 | 04.11.2011 19:20 |
Could not convert variant of type (Olestr) into type (Double) | java_91 | Общие вопросы Delphi | 1 | 18.02.2011 18:46 |
Could not convert variant of type (UnicodeString) into type (Double) | postaveche | БД в Delphi | 11 | 13.12.2010 16:41 |