|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.08.2014, 21:48 | #11 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
30.08.2014, 21:53 | #12 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
|
01.09.2014, 00:14 | #13 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Набросал небольшой тест, думаю он все достаточно просто объясняет. Идея следующая: в цикле пробегаем по массиву s и каждый проход суммируем в i.
Компилятор выбирает два способа построить код: 1. копить сумму в регистре, а сброс в память сделать при выходе из него. 2. на каждой итерации делать сброс в память. Вывод можно сделать не только о циклах, но и взаимоотношениях указателей различных типов в целом. Следует обратить внимание на взаиморасположение "!!! Сброс *i из регистра в память" и "!!! конец цикла". g++ 1.cpp -O2 -S : Код:
Последний раз редактировалось 220Volt; 01.09.2014 в 00:30. |
01.09.2014, 01:56 | #14 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
По идее, так тоже можно:
Код:
|
01.09.2014, 03:25 | #15 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Ну... забавно конечно, но я стараюсь писать как можно более простой и понятный код. Чтобы другим в нем можно было разобраться тоже.
Лично я считаю, что если в коде есть reinterpret_cast, то с большой вероятностью, что-то где-то не так. Нужно как минимум попробовать от него избавиться. Ну а если оно еще и кастуется в неправильный тип - то ваще... Ваши примеры с юнионом я не понял. Точнее, не понял почему компилятор не может из юниона выкидывать неиспользуемые поля. Я думаю может и никакой опасности это не несет. |
01.09.2014, 05:25 | #16 | |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Цитата:
Код:
Последний раз редактировалось 220Volt; 01.09.2014 в 05:28. |
|
01.09.2014, 08:33 | #17 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
01.09.2014, 08:39 | #18 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Использовал placement new, ну а полученный буфер кастовл.
|
05.09.2014, 11:15 | #19 |
Форумчанин
Регистрация: 14.12.2012
Сообщений: 668
|
Код:
|
06.04.2015, 13:48 | #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 |