Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:04 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
rp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:26 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится. // ... вставлен для обозначения непустоты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:31 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится. Естественно читатель должен был догадаться, что v1 не пустой и в него что-то вставилось до циклов. Иначе совсем был бы глупый вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:32 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
rp7807, Все зависит от того, согласится ли компилятор инлайнить этот вызов. При -О0, скорее всего, откажется, и да, пару тактов на вызов будут потрачено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:47 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Mozokrp7807, Все зависит от того, согласится ли компилятор инлайнить этот вызов. При -О0, скорее всего, откажется, и да, пару тактов на вызов будут потрачено. Ну, по-умолчанию считается, что -O2 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:50 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
rp7807, Тогда, независимо от того, меняется ли вектор в цикле, вызов заменится прямым обращением к члену/членам с размером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 21:53 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
rp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов? О всех компиляторах скопом наверное говорить не стоит. Подставить тело метода вместо вызова наверное сможет всякий современный компилятор (функция при этом должна быть подготовлена для inline) Это не дорогой вызов в смысле что его стоимость O(1). Это дорогой вызов, в смысле что сам вызов -- достаточно сложная операция, а этот метод состоит в возврате готового значения дата мембера, одна ассемблерная комманда. Так что вызов очень резонно инлайнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 23:47 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Mozokrp7807, Тогда, независимо от того, меняется ли вектор в цикле, вызов заменится прямым обращением к члену/членам с размером. Этому нет гарантии. Но на практике конечно же так должно происходить в 90% случаев (если код не отладочный). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 23:49 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
rp7807 Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов? с каких это пор? А если я в другом потоке вставляю елементы? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 00:05 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Lepsikrp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов? с каких это пор? А если я в другом потоке вставляю елементы? Код: plaintext 1. const_cast да и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 00:16 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Lepsikrp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов? с каких это пор? А если я в другом потоке вставляю елементы? Код: plaintext 1. Если вставляешь в другом потоке, то по стандарту как минимум: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 01:39 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
rp7807Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится. Естественно читатель должен был догадаться, что v1 не пустой и в него что-то вставилось до циклов. Иначе совсем был бы глупый вопрос. А у тебя наверно тело цикла до того быстрое что соизмеримо с получением size? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 02:27 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
---по стандарту как минимум volatil, volatile всего лишь для синхронизации, присутствие или отсуствие оного никак не запретит говнокоду туда что-то вставить, а const по крайней мере даст понять компилятору что программер дает зуб что имет желание не менятЬ нигде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 21:28 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Lepsik---по стандарту как минимум volatil, volatile всего лишь для синхронизации, присутствие или отсуствие оного никак не запретит говнокоду туда что-то вставить, а const по крайней мере даст понять компилятору что программер дает зуб что имет желание не менятЬ нигде Lepsikrp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов? с каких это пор? А если я в другом потоке вставляю елементы? Код: plaintext 1. Вот в приведенном коде автора , компилятор действительно умеет понимать, что код не меняет значение size() и легко может вставить туда константу, даже "если я в другом потоке вставляю елементы". Чтобы компилятор гарантированно не вставлял константу - нужен volatile . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 21:41 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Lepsik---по стандарту как минимум volatil, volatile всего лишь для синхронизации, присутствие или отсуствие оного никак не запретит говнокоду туда что-то вставить, а const по крайней мере даст понять компилятору что программер дает зуб что имет желание не менятЬ нигде Удивительно, но все строго наоборот. Наличие const не гарантирует неизменность объекта, а volatile не дает синхронизацию, а всего лишь отменяет кеширование значения во вспомогательных переменных. При этом const согласно последнему стандарту означает обещание синхронизированного доступа во всех методах вызываемых для такого объекта (т.е. компилятор в праве рассчитывать на это). ЗЫ. В данном случае volatile приведет всего лишь к ошибке компиляции, т.к. метод size() для вектора в stl не содержит перегрузки для volatile. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 21:54 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyПри этом const согласно последнему стандарту означает обещание синхронизированного доступа во всех методах вызываемых для такого объекта (т.е. компилятор в праве рассчитывать на это). А что значит синхронизированный доступ? Anatoly MoskovskyЗЫ. В данном случае volatile приведет всего лишь к ошибке компиляции, т.к. метод size() для вектора в stl не содержит перегрузки для volatile. Кстати, вот это интересно из каких соображений они сделали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:08 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
по стандарту как минимум volatilА что значит синхронизированный доступ? Это значит что отсутствют гонки, в частности например изменения вносимые другими потоками видны целиком, а не частично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:32 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyпо стандарту как минимум volatilА что значит синхронизированный доступ? Это значит что отсутствют гонки, в частности например изменения вносимые другими потоками видны целиком, а не частично. В смысле, - это мы компилятору говорим, чтобы он сделал что-то чтобы не было гонок (выравнял объект) - или это мы обещаем сами себе, что будем использовать только атомарные операции с блокировкой кэш-линий LOCK XCHG, LOCK CMPXCHG, LOCK XADD? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:36 |
|
||
|
Автоматическая оптимизация std::vector::size() при компиляции.
|
|||
|---|---|---|---|
|
#18+
по стандарту как минимум volatil, Обещаем себе и всем остальным, что там либо мьютекс, либо другие способы синхронизации, либо что объект не меняется и поэтому нечего синхронизировать. Компилятор ничего не обязан обеспечивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 22:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38469304&tid=2019857]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 291ms |
| total: | 577ms |

| 0 / 0 |
