|
|
|
Можно ли для стд::вектор'а взять адрес и-го элемента?27.11.2014, 19:09. Показов 7964. Ответов 43
Метки нет (Все метки)
Допустим, есть код на Си:
C int a[10000]; __builtin_prefetch (&a[1000]); /* тут идёт обработка первых 1000 элементов массива [0 - 999] */ __builtin_prefetch (&a[2000]); /* тут идёт обработка первых 1000 элементов массива [1000 - 1999] */ /* и так далее */ Теперь берём код на Си:: C++ std::vector<int> a (10000);
0
|
|
| 27.11.2014, 19:09 | |
|
Ответы с готовыми решениями:
43
как получить адрес элемента вектора посредством g++?
|
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||||||
| 27.11.2014, 19:51 | |||||||||||
|
http://en.cppreference.com/w/c... ector/data
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 27.11.2014, 20:08 | |||||||
Сообщение было отмечено Убежденный как решение
Решение
Можно:
По стандарту Вектор обязан держать внутри себя непрерывный блок памяти. Поэтому, можно смело воспринимать этот кусок как обычный сишный массив.
1
|
|||||||
|
Ушел с форума
|
||
| 27.11.2014, 20:10 | ||
|
C++03
0
|
||
|
|
|
| 27.11.2014, 20:50 [ТС] | |
|
Из чтения описания http://www.cplusplus.com/refer... r/operator[]/ я понял, что "reference" (в описании прототипа) - это ссылка (т.е., грубо говоря, int&, а не int*). Ковыряние в препроцессированном файле вроде бы тоже об этом говорит. Но если сие можно записать в указатель (см. пост #3), то это не ссылка. А что тогда?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 27.11.2014, 20:55 | ||||||||||||
|
Осталось понять: что же такое, эта ссылка? Ссылка на языке с++ - это тип данных, который не обладает идентичностью. Грубо говоря, ссылка - псевдоним некого оригинального объекта, и любые действия над ссылкой - есть действие над этим оригинальным объектом. Поэтому, ссылки - это единственный тип данных на языке, у которых не существует объекта. Вы не сможете взять адрес ссылки, потому что попытка взять адрес ссылки - это взятие адреса на самом деле у оригинального объекта. У самой же ссылки адреса просто не существует. Поэтому, когда мы делаем так:
То бишь мы получаем адрес объекта, который существует в непрерывном блоке памяти вектора.
0
|
||||||||||||
|
|
|||||||||||
| 27.11.2014, 21:02 [ТС] | |||||||||||
|
Давай-ка чтобы не лезть в С++-11 остановимся на нормальном С++, в котором нет auto. Я так и не понял, с чего бы это вдруг
0
|
|||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||
| 27.11.2014, 21:16 | |||||||||||||||||||||
|
Нет, не так.
Смотрите:
Действия над ссылкой - это на самом деле действие над оригинальным объектом. То есть, попытка взять адрес у r это взятие адреса у a[0] Добавлено через 9 минут или вот такой пример: есть обычный сишный массив:
Но мы не знаем имен этих объектов. Мы знаем только имя их контейнера-держателя. Поэтому, мы не можем обратиться к элементу по его имени. А можем только через имя массива. Ссылка - это псевдоним, алеас, альтернативное имя объекта:
1
|
|||||||||||||||||||||
|
|
||||||||||||
| 27.11.2014, 21:19 [ТС] | ||||||||||||
Но я на самом деле понял. Далее поясняю для тех, кому это место вдруг окажется непонятным.Любое обращение к ссылке (который на уровне кода есть указатель) всегда означает неявное разыменование этого самого скрытого указателя: Сравнение указателей и ссылок.. В примере с взятием адреса на ссылку происходит ровно то же самое. Только пример возьму совсем простой:
0
|
||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||
| 27.11.2014, 21:30 | |||||||||||||||||
|
Ссылка - псевдоним имени объекта. И хотя в большинстве случаев компиляторы реализуют механизм ссылки через механизм указателей, они не обязаны этого делать. Во многих случаях компилятор может сделать inline подстановку оригинального объекта по всем тем местам, где используется ссылка, и вообще "физически" не создавать объект для ссылки. Опять таки, у ссылок и указателей слишком уж разные свойства. Пример: Что будет, если взять размер указателя?
Но поскольку любые действия над ссылкой есть действие над оригинальным объектом, то попытка взять размер ссылки - это попытка взять размер оригинального объекта. Поэтому, sizeof(reference) будет развен sizeof(типа оригинального объекта). А ещё не бывает "константных ссылок". В принципе не бывает.
... В целом поведение ссылок и указателей настолько различается, что лучше воспринимать их как принципиально разные сущности. И не воспринимать ссылку как "указатель, который автоматически разыменовывается"
0
|
|||||||||||||||||
|
|
||||||
| 27.11.2014, 22:09 [ТС] | ||||||
|
C++ int x; const int &ref = x; ref = 0;
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||
| 27.11.2014, 23:53 | |||||||||||||||||
|
Потому что, когда я говорю о языке с++, то я имею ввиду именно с++ код. Я подразумеваю синтаксис с++. Не ассемблер, и не машинный код. Ну так вот на уровне с++ кода - ссылка не есть указатель. Разное поведение. Разные свойства. Разные правила игры. Потому что sizeof не обращается к объекту. Он вообще не работает с объектами. Он работает с типами. Поведение с указательным типом - одно. С ссылочным - другое. И здесь аналогия "ссылка, как указатель" уже не работает. Если не считать маленького нюанса: ссылка, это псевдоним имени оригинального объекта. Она обладает именем. А имя может обладать квалификатором, определяя можно ли через это альтернативное имя изменить объект, или нет. Но при этом ссылка не обладает идентичностью: имя у ссылки есть, а объекта нету. Указатели могут быть const, могут иметь реальные полноценные объекты, которые реально занимают место в памяти. И мы всегда можем получить адрес по которому живет объект-указатель. Ссылки имеют только имена, но не имеют объектов. (с точки зрения закулисной кухни компилятора конечно могут иметь, но они все равно не доступны для программиста с++ законными способами). Стандарт не накладывает ограничений. Главное, что бы они реализовали правила поведения "альтернативного имени объекта". А как именно это будет реализовано на низком уровне - стандарту не принципиально. Обращение к функции-члену через ссылку правильнее воспринимать, как обращение к функции-члену через оригинальное имя объекта.
Добавлено через 8 минут Между разыменованным указателем и ссылкой разницы нет.
0
|
|||||||||||||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||||
| 27.11.2014, 23:59 | |||||||||
0
|
|||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 28.11.2014, 00:10 | ||
|
У указателя есть объект, который наделяет имя идентичностью. Поэтому для указателя критично - можем ли мы изменить сам объект, хранящий адрес, или не может. Ссылка - просто это другое имя. Собственного объекта у неё нет. Нельзя изменить то, чего нет. Константность теряет смысл. Критично только, можем ли мы по этому альтернативному имени изменить оригинальный объект или нет. Но это тоже самое что и с указателем: можно ли через него изменить объект, на который он ссылается.
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 28.11.2014, 00:15 | ||
0
|
||
|
|
||||||||
| 28.11.2014, 10:19 [ТС] | ||||||||
|
Ты можешь сколько угодно объяснять незнающему человеку в терминах синонимов, и у него нормального понимания не будет. Объясни один раз через эквивалент с указателями, и человек всё поймёт. Сразу глубину смысл может и не прочувствует, но принцип работы поймёт. Причём на практике проверено многократно Если что - я знаю, что такое ссылка. Пример в посте 9 - это объяснение для тех, кто не знает или плохо понимает. И с большой вероятностью они поймут, как отработал такой код. При этом я сам, понимая, что такое ссылка, с большим трудом понял объяснения из комментариев #6 и #8. Моим приоритетом было доступное объяснение. Я почти не программирую на Си++, а потому у меня немного сломался моск на операции взятия адреса от a[] (где [] был оператором), собственно только потому я об этом и спросил
0
|
||||||||
|
Заблокирован
|
||
| 28.11.2014, 11:32 | ||
0
|
||
|
Заблокирован
|
|
| 28.11.2014, 12:50 | |
|
Evg, что ссылка в С++ - это не просто запись со значком & в коде программы, а еще и механизм передачи адреса от обьекта в память. И для разных обьектов этот механизм внутри программы будет отличаться.
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 28.11.2014, 19:46 | ||
|
Кстати именно об этом я и писал в том посте. Компилятор исходит из семантики ссылки и делает определенные оптимизации. Естественно, если мы сделаем адрес константным, то результирующий код будет полностью одинаковым. На самом деле, раз тебе понятно, о чем была речь, то я не вижу дальше продолжать этот разговор. Т.к. специалист с опытом, в принципе, имеет право на свою точку зрения и толкование определенных вещей. Просто рассуждения hoggy и твои находятся в разных плоскостях. Это как спор физика и математика об одних и тех же процессах (между прочим реальный пример), оба правы, но к общему мнению никак не придут
0
|
||
| 28.11.2014, 19:46 | |
|
Помогаю со студенческими работами здесь
20
Где можно взять ftp-компонент, для того чтобы можно было закачивать со своего скрипта на фтп-сервак файлы?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|