Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> &array[ 0 ] vs. array 
:(
    Опции темы
semibug
Дата 18.11.2011, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Если некоторая функция принимает указатель на char, например:
Код

void foo( char* data );

то имея массив объявленный как
Код

char array[ 42 ];

можно вызвать функцию foo так:
Код

foo( arrray );

либо так:
Код

foo( &arrray[ 0 ] );

Причем второй способ встречался чаще. Есть ли разница в этих двух способах вызова функции?

PM   Вверх
borisbn
Дата 18.11.2011, 21:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Голосую за второй вариант- можно потом заменить тип array на vector или string без изменения твоего кода


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ecspertiza
Дата 18.11.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: нет
Всего: 5



мне тоже стало интересно почему эти варианты идентичны ? я второй понял бы как передача ссылки на первый элемент массива, но вроде как передается весь массив


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
borisbn
Дата 18.11.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(ecspertiza @  18.11.2011,  21:44 Найти цитируемый пост)
но вроде как передается весь массив

если смотреть со стороны ф-ции
Цитата(semibug @  18.11.2011,  19:50 Найти цитируемый пост)
void foo( char* data );

то передаётся, все-таки, указатель на начало массива


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 19.11.2011, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  18.11.2011,  20:14 Найти цитируемый пост)
Голосую за второй вариант- можно потом заменить тип array на vector или string без изменения твоего кода 

смелое однако заявление smile 



Это сообщение отредактировал(а) mes - 19.11.2011, 02:42


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.11.2011, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  02:42 Найти цитируемый пост)
смелое однако заявление

оператор индекса ведь есть и у вектора и у стринга. или что?
PM WWW   Вверх
borisbn
Дата 19.11.2011, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  19.11.2011,  02:42 Найти цитируемый пост)
смелое однако заявление

Если Вы имели в виду, что необходимо проверять строку на предмет empty(), то да - изменения потребуются (как, впрочем, и с вектором).
Или, может, Вы имели в виду, что operator[] строки не обязан возвращать указатель на, так сказать, raw-данные строки ?

В общем, хотелось бы комметариев

Это сообщение отредактировал(а) borisbn - 19.11.2011, 09:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
newbee
Дата 19.11.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 3
Всего: 19



Голосую за первый вариант, потому что второй - напрасное усложнение.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Леопольд
Дата 19.11.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(borisbn @  19.11.2011,  09:25 Найти цитируемый пост)
operator[] строки не обязан возвращать указатель
operator[] возвращает ссылку на элемент под этим индексом

Цитата(borisbn @  19.11.2011,  09:25 Найти цитируемый пост)
В общем, хотелось бы комметариев
IMHO, всё зависит от реализации контейнера, поэтому второй вариант гарантирует портабельность кода, а первый нет.


Это сообщение отредактировал(а) Леопольд - 19.11.2011, 11:28


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
mes
Дата 19.11.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  19.11.2011,  08:25 Найти цитируемый пост)
 Вы имели в виду, что operator[] строки не обязан возвращать указатель на, так сказать, raw-данные строки ?

 smile

Добавлено через 1 минуту и 23 секунды
Цитата(borisbn @  19.11.2011,  08:25 Найти цитируемый пост)
В общем, хотелось бы комметариев

я хотел дать возможность самим найти ответ на вопрос.. что впрочем Вы исделали smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.11.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  11:31 Найти цитируемый пост)
 smile 

а разве существуют реализации std::string/std::vector возвращающие не ссылку на элемент?
 smile 
нет, конечно, в Qt`ешных контейнерах это нормально, там и множество не сортированное. но это ничего. все равно никто(почти) из пользователей этого и не заметил.
почти уверен в том, что и borisbn об этом не знал ;)

Это сообщение отредактировал(а) boostcoder - 19.11.2011, 12:07
PM WWW   Вверх
Dem_max
Дата 19.11.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



да без разницы как сделаешь, лишь бы самому было понятно, но лучше второй вариант, так будет понятней что передаешь указатель массива, а не какую нить переменную (чисто так чтение кода упрощается со вторым вариантом).


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 19.11.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(boostcoder @  19.11.2011,  11:07 Найти цитируемый пост)
а разве существуют реализации std::string/std::vector возвращающие не ссылку на элемент?

существуют (законы по стандарту) реализации std::string в которых расположение элементов не плоское.. (в отличие от vector`а)..
Это мы еще не впомнили про возможное отсутствие признака конца строки..  

Цитата(boostcoder @  19.11.2011,  11:07 Найти цитируемый пост)
 конечно, в Qt`ешных контейнерах

речь не о них, а о stl..

Добавлено через 2 минуты и 53 секунды
поэтому конструкция типа  &str[ 0 ]  (для std::string) - это путь к длительному и весьма занятному времяпровождению за дебагом smile




--------------------
PM MAIL WWW   Вверх
volatile
Дата 19.11.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(borisbn @  19.11.2011,  09:25 Найти цитируемый пост)
строки не обязан возвращать указатель на, так сказать, raw-данные строки 

Теоретически эти данные могут быть расположены не последовательно в памяти. Мы не знаем какой внутренний механизм у стринга. Чтобы расположить данные последовательно, и завершить их нулем, существует .c_str();

Одна из вещей которая меня всегда удивляет в С++, (как впрочем видимо и в других языках), есть вещи которые работают в реале всегда, но теоретически нарушают некое правило, и тем самым вызвают бурю возражений (одну из этих вы привели).
И есть обратное, когда код прямо не нарушает правило, но в реале, глючит абсолютно везде и абсолютно всегда! (хотя бы тот же самый utf-8). И это почему-то, ни у кого не вызывает бурю эмоций!
 smile 


PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  12:16 Найти цитируемый пост)
существуют

ну раз Вы говорите...

PM WWW   Вверх
mes
Дата 19.11.2011, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



volatile,у вас вроде VS (или кто нибудь другой у кого она есть)..
  какой sizeof у std::string ? 
 VS желательна старой версии, на новой будет скорей всего будет 4 байта ( из за cow)..


Это сообщение отредактировал(а) mes - 19.11.2011, 12:36


--------------------
PM MAIL WWW   Вверх
semibug
Дата 19.11.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



mes, VS2005/Win7x64, Default Project Settings for Console App:
Debug
32 bytes
Release
28 bytes

попробовал в VS2010 - результат тот же

Это сообщение отредактировал(а) semibug - 19.11.2011, 12:53
PM   Вверх
volatile
Дата 19.11.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(mes @  19.11.2011,  12:30 Найти цитируемый пост)
какой sizeof у std::string ? 

mes, 
В студии стринг маленькие строки (кажется до 14 байт, точно не помню) хранит внутри себя, без выделения памяти. Поэтому размер не 4 байта, а как сказал 
semibug, 
Цитата(semibug @  19.11.2011,  12:47 Найти цитируемый пост)
Debug
32 bytes
Release
28 bytes




Это сообщение отредактировал(а) volatile - 19.11.2011, 13:04
PM MAIL   Вверх
mes
Дата 19.11.2011, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  19.11.2011,  12:03 Найти цитируемый пост)
В студии стринг маленькие строки (кажется до 14 байт, точно не помню) хранит внутри себя, без выделения памяти. 

smile , и для больших строк этот буфер остается незайдествованным.. этим они и спасаются от вышеуказанной ошибки.. но ничто не мешало (кроме их взглядов на эффективность) им сделать реализацию, которая хранила бы часть строки в локальном буфере, а хвост в куче..

Добавлено через 1 минуту и 55 секунд
Цитата(mes @  19.11.2011,  12:33 Найти цитируемый пост)
больших строк этот буфер остается незайдествованным.

это не проверял, но я все ж надеюсь что у них именно так, а не 
Цитата(mes @  19.11.2011,  12:33 Найти цитируемый пост)
 хвост в куче

потому как в противном случае, пдобная проблема всплывала бы часто..

Добавлено через 6 минут и 13 секунд
Цитата(boostcoder @  19.11.2011,  11:27 Найти цитируемый пост)
Цитата

существуют
ну раз Вы говорите...

я говорил :
Цитата(mes @  19.11.2011,  11:16 Найти цитируемый пост)
существуют (законы по стандарту)

а эт несколько иное значение smile

Добавлено через 11 минут и 53 секунды
Цитата(volatile @  19.11.2011,  11:19 Найти цитируемый пост)
 которые работают в реале всегда

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


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 19.11.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(mes @  19.11.2011,  13:33 Найти цитируемый пост)
для больших строк этот буфер остается незайдествованным.. этим они и спасаются от вышеуказанной ошибки.

где-то на винграде это обсуждалось. но я не понимаю где здесь хоть намек на эффективность? вот нужно создать мильен строк размером больше того буфера, и что мы получим? - пустые расходы памяти. ведь 14*1000000 = 14мб smile 
PM WWW   Вверх
volatile
Дата 19.11.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(boostcoder @  19.11.2011,  14:02 Найти цитируемый пост)
я не понимаю где здесь хоть намек на эффективность? вот нужно создать мильен строк размером больше того буфера

Это же не объективный (специально подобранный) тест, чтобы дескредитировать такой алгоритм.
Почему-бы не взять (тоже не объективный) тест с мульеном строк, но размером чуть меньше этого буфера. smile Если вспомнить что выделение памяти одна из самых тормознутых операций, то тест будет далеко не в пользу реализаций с коротким sizeof (string).
Впрочем я не защищаю их алгоритм.
У стл-порт короткий sizeof (string), можно поставить его - выбор есть всегда. Но реального быстродействия, и экономии памяти при использовании стл-порт::string, у я не заметил.

Цитата(mes @  19.11.2011,  13:33 Найти цитируемый пост)
но ничто не мешало .. им сделать реализацию, которая хранила бы часть строки в локальном буфере, а хвост в куче..

Вот здесь ударение надо поставить на бы.
mes, я не возражаю что это нарушение правил, и что так делать нельзя. Я только хочу сказать, что в реале я не встречал (возможно даже они где-то есть, но я не видел) реализаций стринга которые бы не работали, так как преположил borisbn.

PM MAIL   Вверх
mes
Дата 19.11.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(volatile @  19.11.2011,  13:50 Найти цитируемый пост)
стринга которые бы не работали, так как 

если это правило случайно ( VS была специально приведена дкак пример вполне не ожидаемой реализации) не было нарушено, это не дает нам право никаких оснований на спокойное их нарушение..

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



Это сообщение отредактировал(а) mes - 19.11.2011, 15:29


--------------------
PM MAIL WWW   Вверх
volatile
Дата 19.11.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



mes, абсолютно согласен.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.