powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Автоматическая оптимизация std::vector::size() при компиляции.
20 сообщений из 20, страница 1 из 1
Автоматическая оптимизация std::vector::size() при компиляции.
    #38469168
Фотография rp7807
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Автоматическая оптимизация std::vector::size() при компиляции.
    #38469187
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
...
Рейтинг: 0 / 0
Автоматическая оптимизация std::vector::size() при компиляции.
    #38469192
Фотография rp7807
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
// ... вставлен для обозначения непустоты.
...
Рейтинг: 0 / 0
Автоматическая оптимизация std::vector::size() при компиляции.
    #38469193
Фотография rp7807
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёшrp7807, gcc с -O3 весь этот Ваш код вообще выкинет, потому что у Вас v1 пустой, v1.size() всегда 0 и ни один цикл ни разу не выполнится.
Естественно читатель должен был догадаться, что v1 не пустой и в него что-то вставилось до циклов. Иначе совсем был бы глупый вопрос.
...
Рейтинг: 0 / 0
Автоматическая оптимизация std::vector::size() при компиляции.
    #38469200
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rp7807,

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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


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

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

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

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

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

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

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


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