Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Автоматическая оптимизация std::vector::size() при компиляции. / 20 сообщений из 20, страница 1 из 1
18.11.2013, 21:04
    #38469168
rp7807
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
std::vector<int> v1;

for ( size_t i = 0; i < v1.size(); ++v1 )
{
    // ...
}

for ( size_t i = 0; i < v1.size(); ++v1 )
{
    // ...
}

for ( size_t i = 0; i < v1.size(); ++v1 )
{
    // ...
}



Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов?
...
Рейтинг: 0 / 0
18.11.2013, 21:26
    #38469187
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
rp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
...
Рейтинг: 0 / 0
18.11.2013, 21:31
    #38469192
rp7807
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
// ... вставлен для обозначения непустоты.
...
Рейтинг: 0 / 0
18.11.2013, 21:32
    #38469193
rp7807
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
Естественно читатель должен был догадаться, что v1 не пустой и в него что-то вставилось до циклов. Иначе совсем был бы глупый вопрос.
...
Рейтинг: 0 / 0
18.11.2013, 21:47
    #38469200
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
rp7807,

Все зависит от того, согласится ли компилятор инлайнить этот вызов. При -О0, скорее всего, откажется, и да, пару тактов на вызов будут потрачено.
...
Рейтинг: 0 / 0
18.11.2013, 21:50
    #38469202
rp7807
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Mozokrp7807,

Все зависит от того, согласится ли компилятор инлайнить этот вызов. При -О0, скорее всего, откажется, и да, пару тактов на вызов будут потрачено.
Ну, по-умолчанию считается, что -O2 :)
...
Рейтинг: 0 / 0
18.11.2013, 21:53
    #38469204
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
rp7807,

Тогда, независимо от того, меняется ли вектор в цикле, вызов заменится прямым обращением к члену/членам с размером.
...
Рейтинг: 0 / 0
18.11.2013, 23:47
    #38469247
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
rp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов?

О всех компиляторах скопом наверное говорить не стоит.

Подставить тело метода вместо вызова наверное сможет всякий современный компилятор
(функция при этом должна быть подготовлена для inline)

Это не дорогой вызов в смысле что его стоимость O(1). Это дорогой вызов, в смысле что сам вызов -- достаточно сложная операция, а этот метод состоит в возврате готового значения дата мембера, одна ассемблерная комманда. Так что вызов очень резонно инлайнить.
...
Рейтинг: 0 / 0
18.11.2013, 23:49
    #38469251
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Mozokrp7807,

Тогда, независимо от того, меняется ли вектор в цикле, вызов заменится прямым обращением к члену/членам с размером.

Этому нет гарантии.
Но на практике конечно же так должно происходить в 90% случаев (если код не отладочный).
...
Рейтинг: 0 / 0
19.11.2013, 00:05
    #38469259
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
rp7807
Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов?

с каких это пор? А если я в другом потоке вставляю елементы?

Код: plaintext
1.
вот если бы  const std::vector<int> v1;
...
Рейтинг: 0 / 0
19.11.2013, 00:16
    #38469265
rp7807
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Lepsikrp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов?

с каких это пор? А если я в другом потоке вставляю елементы?

Код: plaintext
1.
вот если бы  const std::vector<int> v1;


const_cast да и всё.
...
Рейтинг: 0 / 0
19.11.2013, 01:39
    #38469290
Автоматическая оптимизация std::vector::size() при компиляции.
Lepsikrp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов?

с каких это пор? А если я в другом потоке вставляю елементы?

Код: plaintext
1.
вот если бы  const std::vector<int> v1;


Если вставляешь в другом потоке, то по стандарту как минимум:
Код: plaintext
1.
volatile std::vector<int> v1;
...
Рейтинг: 0 / 0
19.11.2013, 02:27
    #38469304
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
rp7807Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
Естественно читатель должен был догадаться, что v1 не пустой и в него что-то вставилось до циклов. Иначе совсем был бы глупый вопрос.
А у тебя наверно тело цикла до того быстрое что соизмеримо с получением size?
...
Рейтинг: 0 / 0
19.11.2013, 21:28
    #38470517
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
---по стандарту как минимум volatil,

volatile всего лишь для синхронизации, присутствие или отсуствие оного никак не запретит говнокоду туда что-то вставить, а const по крайней мере даст понять компилятору что программер дает зуб что имет желание не менятЬ нигде
...
Рейтинг: 0 / 0
19.11.2013, 21:41
    #38470524
Автоматическая оптимизация std::vector::size() при компиляции.
Lepsik---по стандарту как минимум volatil,

volatile всего лишь для синхронизации, присутствие или отсуствие оного никак не запретит говнокоду туда что-то вставить, а const по крайней мере даст понять компилятору что программер дает зуб что имет желание не менятЬ нигде
Lepsikrp7807Современные компиляторы умеют понимать, что возвращаемое значение v1.size() не поменяется и втыкать туда константу, вместо вызова? Дорогой ли этот вызов?

с каких это пор? А если я в другом потоке вставляю елементы?

Код: plaintext
1.
вот если бы  const std::vector<int> v1;


Вот в приведенном коде автора , компилятор действительно умеет понимать, что код не меняет значение size() и легко может вставить туда константу, даже "если я в другом потоке вставляю елементы".
Чтобы компилятор гарантированно не вставлял константу - нужен volatile .
...
Рейтинг: 0 / 0
19.11.2013, 21:54
    #38470537
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
Lepsik---по стандарту как минимум volatil,

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

ЗЫ. В данном случае volatile приведет всего лишь к ошибке компиляции, т.к. метод size() для вектора в stl не содержит перегрузки для volatile.
...
Рейтинг: 0 / 0
19.11.2013, 22:08
    #38470551
Автоматическая оптимизация std::vector::size() при компиляции.
Anatoly MoskovskyПри этом const согласно последнему стандарту означает обещание синхронизированного доступа во всех методах вызываемых для такого объекта (т.е. компилятор в праве рассчитывать на это).
А что значит синхронизированный доступ?

Anatoly MoskovskyЗЫ. В данном случае volatile приведет всего лишь к ошибке компиляции, т.к. метод size() для вектора в stl не содержит перегрузки для volatile.
Кстати, вот это интересно из каких соображений они сделали?
...
Рейтинг: 0 / 0
19.11.2013, 22:32
    #38470576
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
по стандарту как минимум volatilА что значит синхронизированный доступ?

Это значит что отсутствют гонки, в частности например изменения вносимые другими потоками видны целиком, а не частично.
...
Рейтинг: 0 / 0
19.11.2013, 22:36
    #38470583
Автоматическая оптимизация std::vector::size() при компиляции.
Anatoly Moskovskyпо стандарту как минимум volatilА что значит синхронизированный доступ?

Это значит что отсутствют гонки, в частности например изменения вносимые другими потоками видны целиком, а не частично.
В смысле,
- это мы компилятору говорим, чтобы он сделал что-то чтобы не было гонок (выравнял объект)
- или это мы обещаем сами себе, что будем использовать только атомарные операции с блокировкой кэш-линий LOCK XCHG, LOCK CMPXCHG, LOCK XADD?
...
Рейтинг: 0 / 0
19.11.2013, 22:48
    #38470594
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоматическая оптимизация std::vector::size() при компиляции.
по стандарту как минимум volatil,

Обещаем себе и всем остальным, что там либо мьютекс, либо другие способы синхронизации, либо что объект не меняется и поэтому нечего синхронизировать.
Компилятор ничего не обязан обеспечивать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Автоматическая оптимизация std::vector::size() при компиляции. / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]