Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30

Можно ли для стд::вектор'а взять адрес и-го элемента?

27.11.2014, 19:09. Показов 9168. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим, есть код на Си:

C
int a[10000];
 
__builtin_prefetch (&a[1000]);
/* тут идёт обработка первых 1000 элементов массива [0 - 999] */
 
__builtin_prefetch (&a[2000]);
/* тут идёт обработка первых 1000 элементов массива [1000 - 1999] */
 
/* и так далее */
Что тут происходит? __builtin_prefetch в данном случае - это встроенная конструкция языка GNU C. Но её можно написать и самому, это непринципиально. __builtin_prefetch специальными командами процессора обращается к данным в памяти, реально не читая никаких значений. Делается это для того, чтобы данные из памяти попали в кэш. В тот момент, пока идёт обработка первых 1000 элементов массива, подсистема памяти (параллельно) перекачивает данные из памяти в кэш. И когда мы начнём обработку вторых 1000 элементов, мы уже не будем терять время на чтение данных из памяти. Параллельно вызываем подкачку следующего блока и т.п. Тут всё хорошо

Теперь берём код на Си::

C++
std::vector<int> a (10000);
Есть какая-то возможность получить адрес (но не ссылку, как это делает метод at) нужного нам элемента массива? Или внутри себя массив данных может быть не сплошным, а потому тут полная инкапсуляция и возможности предподкачки попросту нет?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2014, 19:09
Ответы с готовыми решениями:

Реально ли получить из стд::вектора Сишный массив?
Или для этого придётся поэлементно копировать и смысл теряется? Я понимаю, что указатель на память выделяемую вектором спрятан где-то...

как получить адрес элемента вектора посредством g++?
#include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; int main(){ return 0; vector&lt;int&gt; v; v.push_back(2); ...

Взять адрес базы данных для редактирования пути
Доброе время суток. Честно признаюсь в том вопросе что пишу полный ноль и нужна помощь Есть задача создать сайт по военно патриотическому...

43
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.11.2014, 20:00
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Есть какая-то возможность получить адрес (но не ссылку, как это делает метод at) нужного нам элемента массива?
Оператор &. Только смысл брать этот адрес? Он ведь всё равно будет меняться.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.11.2014, 23:26
Цитата Сообщение от Evg Посмотреть сообщение
Там показано следствие работы оптимизаций, а не принципы построения ссылки.
принцип ссылки - использование имени.
Если бы вы курили шаблоны, я мог бы показать на что способен компилятор не зная адреса, но зная имя.

В то же время, если функция имеет дело с указателем - будь добра проверить его.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
28.11.2014, 23:44  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это как спор физика и математика об одних и тех же процессах
Да вот что-то и мне кажется, что спор идёт на тему "жёлтый круг" vs "круг жёлтого цвета"
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.11.2014, 01:04
Цитата Сообщение от Evg Посмотреть сообщение
Да вот что-то и мне кажется, что спор идёт на тему "жёлтый круг" vs "круг жёлтого цвета"
Так часто бывает. К сожалению. Я понимаю о чём Вы говорите, Evg, когда говорите, что ссылка ведёт себя так как "указатель, который всегда разименовывается". И я понимаю hoggy, когда он говорит о том, что это разные типывещи. Но я не понимаю, как это противопоставить для спора.
Можно бы подлить масла заявлением вроде: "Ссылка в С++ это хорошо обрезанныйограниченный указатель". Но смысл? Указатель полноценный тип, образующий переменную и имеющий развитый функционал. Есть 100500 вариантов использования указателей в пределах области. Ссылка (до С++11) не образует переменной, не может быть объявлена без переменной и практически нигде не может быть разумно использована в пределах области. Вся её прелесть в объявлении параметров и там она по действию похожа на указатель, но проще синтаксически. По сути, речь идёт о изменении правил при передаче и возврате значения. Это легко понять тем кто начал с таких вещей как PHP, Java или C#. Вы скажете, - найди того кто так начинает?
Я для примера, просто. Есть языки, где практически всё на ссылках и ссылки значительно развитее и там передача по ссылке это основной путь. Для того, чтобы иметь проблемы с пониманием ссылок, нужно сначала проникнуться передачей по значению, как основным способом, а потом столкнуться с передачей по ссылке. Передача по указателю, кстати, во многих источниках называется передачей по ссылке и это даёт ещё больше уверенности говорить о том, что ссылки и указатели имеют сходную семантику при передаче.
А указывать в вектор достаточно острая процедура. Нужно же быть уверенным, что не произойдёт реалок для него. По идее можно выделить память сразу и запретить реалок применяя функцию-член reserve. Evg, Вам ( и мне тоже ) по душе этот автор и ресурс:
http://alenacpp.blogspot.com/2... or_30.html

По сути итераторы это же и есть отслеживающие дескрипторы для вектора и их смысл в том, чтобы сохранять валидность и не давать доступа к физическим адресам. Тем не менее и они не сохраняют валидность при целом ряде операций, таких как вставка например. Поэтому пользоваться адресами на память внутри вектора наверное можно, но нужно иметь хорошую память. Тут не имею достаточно опыта, чтобы утверждать. Самому интересно.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2014, 12:18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я понимаю о чём Вы говорите, Evg, когда говорите, что ссылка ведёт себя так как "указатель, который всегда разименовывается".
Именно так она себя и ведёт. А что должна иначе? Но поищите ка в стандарте хоть одно упоминание того, что также она и реализована?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
29.11.2014, 12:22  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нужно же быть уверенным, что не произойдёт реалок для него
Если в Си пользоваться динамическими массивами, то проблемы будут те же самые. Понятное дело, что когда речь идёт о получении пиковой производительности, нужно чётко понимать, как работают все абстракции, без этого лезть в оптимизации, учитывающие особенности работы аппаратуры, попросту нет смысла
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.11.2014, 12:36
Цитата Сообщение от taras atavin Посмотреть сообщение
Именно так она себя и ведёт. А что должна иначе?
Откуда вопрос?
Цитата Сообщение от taras atavin Посмотреть сообщение
Но поищите ка в стандарте хоть одно упоминание того, что также она и реализована
Никто не говорил о реализации.
Вообще, чтобы нормально поспорить нужно сказать, что Вы не согласны с:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я понимаю о чём Вы говорите, Evg, когда говорите, что ссылка ведёт себя так как "указатель, который всегда разименовывается".
Потому-де, что она себя ведёт совершенно (или немного) иначе.
Вопрос возник там где оператор [] возвращает сущность - ссылку и появилось желание разобраться, а что это.
Я бы сказал (если бы у меня были мозги)), что имя переменной возвращает ссылку. Объявления нового имени ссылкой, даёт возможность получить эту ссылку по этому новому имени. Это и есть решающий довод в пользу того, что ссылка уже должна существовать до объявления. Хотя могло быть и по другому. Указатель например, можно объявить и инициализировать в 2 этапа, а у ссылки такой возможности нет и это определило многие "фичи".
У индексного выражения a[] доступа к элементу массива/vector'а вызывающего оператор [] нет имени, но есть все его свойства и в левой и в правой части и следовательно оно возвращает ссылку.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2014, 12:38
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это и есть решающий довод в пользу того, что ссылка уже должна существовать до объявления.
Кобыла нервно курит.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.11.2014, 12:49
Цитата Сообщение от Evg Посмотреть сообщение
Если в Си пользоваться динамическими массивами, то проблемы будут те же самые.
Точно! Разница в том, что когда Вам понадобится realoc то Вы его и сделаете. Это ручная операция и ей хватает остроты и без того, что можно забыть про указатели направленные внутрь. Тут хорошая память нужна по определению иначе Бум! В случае с вектором немного иначе. Это умная зверюга и назначив ему кусок reserve, трогать уже нельзя, - цапнуть может.
Ну то есть на интервале, где пользуемся прямыми адресами не допускаем операций которые поднимут его на реалок. Правильно я понимаю? А поскольку вектор делает это сам, то память нужна, особенно, хорошая.
Не серчайте за дикие речи, но пишу как сочиняется. На ходу.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Кобыла нервно курит.
Завидую, - бросил уже полтора месяца как. 15 числа позапрошлого началось. Первые дни было желание всех поубивать. Со временем стало полегче. Но желание не прошло.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2014, 12:55
Цитата Сообщение от IGPIGP Посмотреть сообщение
Завидую, - бросил уже полтора месяца как.
Завидовать сивой лошади?! Ну и ну.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
29.11.2014, 13:00  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
В случае с вектором немного иначе
Опять-таки, практики у меня нет, но вроде бы если ты сделаешь "vector<int> a(1000)" и больше размер трогать не будешь (и, соответственно, не пользоваться всякими динамическими операциями типа "вставить"), то сия конструкция будет эквивалентна статическому массиву. Либо просто выделаешь фрагмент программы, в котором не используешь никакие динамические конструкции, а потому в этом участке можно нормально работать с адресами
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.11.2014, 13:13

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Завидовать сивой лошади?! Ну и ну.
taras atavin, Вы же не сразу сказали что сивой. Всё понемногу? Выкладывайте сразу.


Цитата Сообщение от IGPIGP Посмотреть сообщение
Объявления нового имени ссылкой, даёт возможность получить эту ссылку по этому новому имени. Это и есть решающий довод в пользу того, что ссылка уже должна существовать до объявления.
Что тут вызвало проблему? Опасаясь неинициализированных ссылок, автор языка решил вопрос так.

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Опять-таки, практики у меня нет
У меня её и просто нет. И это не скромность, в отличие от Вас, а чистая правда.
Цитата Сообщение от Evg Посмотреть сообщение
если ты сделаешь "vector<int> a(1000)" и больше размер трогать не будешь (и, соответственно, не пользоваться всякими динамическими операциями типа "вставить"), то сия конструкция будет эквивалентна статическому массиву.
По идее да. То есть если с памятью и самодисциплиной нормально и всё за пределами досягаемости пользователя, то должно быть так.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
29.11.2014, 13:16
Цитата Сообщение от Evg Посмотреть сообщение
Опять-таки, практики у меня нет, но вроде бы если ты сделаешь "vector<int> a(1000)" и больше размер трогать не будешь (и, соответственно, не пользоваться всякими динамическими операциями типа "вставить"), то сия конструкция будет эквивалентна статическому массиву. Либо просто выделаешь фрагмент программы, в котором не используешь никакие динамические конструкции, а потому в этом участке можно нормально работать с адресами
А зачем тогда использовать std::vector? Есть ведь тот же std::array.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2014, 13:18
Цитата Сообщение от IGPIGP Посмотреть сообщение
taras atavin, Вы же не сразу сказали что сивой.
Ну другим то кобылам бредить не положено.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
29.11.2014, 13:20
Evg, вопрос не по теме, префетчинг реально дает что-нибудь? Я года 3 назад эксперементировал с ним и результат был такой - толку от него на интелах особо нет. Но в linux'е можно отключать хардварный префетчинг через командную строку и вот если его отключить, то программным префетчингом можно ускорить код до 100% (смотрел perf'ом, кол-во кэшмиссов реально в разы уменьшается). Но с включенным хардварным префетчингом (который всегда включен) уменьшения кэшмиссов я так и не добился.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
29.11.2014, 13:23  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
А зачем тогда использовать std::vector?
Есть существующая программа с использованием std::vector, её надо ускорить

Цитата Сообщение от Kastaneda Посмотреть сообщение
Evg, вопрос не по теме, префетчинг реально дает что-нибудь?
На интеле для "простых" приложений скорее всего ничего не даст, т.к. там очень большой кэш. Т.е. чтобы эффект появился на интеле нужна очень интенсивная обработка больших данных, чтобы на коротком интервале времени из памяти вынимался объём данных, больший, чем размер кэша.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
29.11.2014, 13:27
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. чтобы эффект появился на интеле нужна очень интенсивная обработка больших данных, чтобы на коротком интервале времени из памяти вынимался объём данных, больший, чем размер кэша.
Ага, так и делал, перемножал гигобоайтовые матрицы, понятно что в кэш они не влезут.

Хотя сейчас задумался, может префетчинг не правильно организовал.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2014, 13:33
Я решал системы тысяч по семнадцать уравнений. Много медленнее рассчётного времени.
0
29.11.2014, 14:37

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Я решал системы тысяч по семнадцать уравнений. Много медленнее рассчётного времени.
Круто конечно, но надо было на компьютере попробовать.:jokingly:

0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.11.2014, 15:55
А я на чём? На самолёте?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.11.2014, 15:55

дан вектор А (N). написать программу нахождения минимального элемента вектора и его индекса. если индекс элемента парный, то часть вектора перед миним
дан вектор А (N). написать программу нахождения минимального элемента вектора и его индекса. если индекс элемента парный, то часть вектора...

Где можно взять ftp-компонент, для того чтобы можно было закачивать со своего скрипта на фтп-сервак файлы?
Народ подскажите где можно взять ftp-компонент, для того чтобы можно было закачивать со своего скрипта на фтп-сервак файлы.

Произведение наименьшего элемента вектора Х и наибольшего элемента вектора Y.
Произведение наименьшего элемента вектора Х и наибольшего элемента вектора Y. размер векторов x и y одинаков и равен n. Прошу, помогите!

Произведение наименьшего элемента вектора Х и наибольшего элемента вектора Y
Произведение наименьшего элемента вектора Х и наибольшего элемента вектора Y. Добавлено через 26 минут Размер векторов одинаков и...

Заменить минимальное значение элемента вектора С размерности p на значение первого положительного элемента этого же вектора
Доброго всем здравия! Собственно задачка следующего порядка: &quot;Заменить минимальное значение элемента вектора С размерности p на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru