Название: как правильней писать указатель? Отправлено: pethead от Октябрь 25, 2010, 14:32 варианты:
1. char * c 2. char* c 3. char *c c си давно не занимался, просто интересно что думают более продвинутые специалисты? разумеется компилер съест любой вариант, но с т.ч. логики, удобства как все таки лучше себя обучить писать? ведь в дальнейшем применении buffer пишется уже без *, или может Название: Re: как правильней писать указатель? Отправлено: Пантер от Октябрь 25, 2010, 14:34 Как захочешь. Главное, чтобы было единообразно.
Название: Re: как правильней писать указатель? Отправлено: kuzulis от Октябрь 25, 2010, 15:02 Я стараюсь п.3 придерживаться к примеру. Но кому как...
Название: Re: как правильней писать указатель? Отправлено: lit-uriy от Октябрь 25, 2010, 16:02 pethead
Записи Код
равносильны: Код По этому писать при имени переменной (т.е. 3 вариант) будет нагляднее. А вот возвращаемое значение функции, на мой взгляд, нагляднее, если писать наоборот: Код
Название: Re: как правильней писать указатель? Отправлено: ufna от Октябрь 25, 2010, 20:35 +1 Юрию, пользуюсь точно такой же системой именно по тем же соображениям
а вообще - главное унифицировать, а не "прыгать" Название: Re: как правильней писать указатель? Отправлено: Alex_cs_gsp от Октябрь 26, 2010, 19:45 Венгерская нотация уже не в моде?
Код: char *pchVar; А насчет того где должно быть * есть соображения char *pchVar1, *pchVar2 Если писать char*, то для второй переменной можно забыть указать * Возвращать ф-ей указатель, честно говоря, считаю плохим стилем, особенно когда это ф-и или методы, которые создают объекты в динамической памяти, хотя такое используется даже в QT. Ведь, возвращаемое значение можно проигнорировать, и если, например, возвращается адрес выделенной памяти, то могут возникнуть утечки. Название: Re: как правильней писать указатель? Отправлено: lit-uriy от Октябрь 27, 2010, 19:34 >>Венгерская нотация уже не в моде?
неа. Ушла в историю в месте с Си. object->method(); тут даже если коньяку поддал, всё равно поймёшь, что object - указатель Название: Re: как правильней писать указатель? Отправлено: pethead от Октябрь 28, 2010, 04:09 всем спасибо.
теперь как то отложилось в голове. в примерах из книжек от англ. авторов тоже везде по разному. Название: Re: как правильней писать указатель? Отправлено: Alex_cs_gsp от Октябрь 28, 2010, 10:00 >>Венгерская нотация уже не в моде? неа. Ушла в историю в месте с Си. object->method(); тут даже если коньяку поддал, всё равно поймёшь, что object - указатель object->method(); глобальный объект или нет? gpObject->method() или pObject->method(). А может быть у Вас константный объект, а метод не константный. kObject->setVal() ?? А префикс m_ для членов класса тоже нафиг? И причем тут Си. Си такой же строго типизированный язык как и С++, только, конечно, в первом приемы используются, которые в С++ не рекомендуются. Название: Re: как правильней писать указатель? Отправлено: lit-uriy от Октябрь 28, 2010, 14:52 >>глобальный объект или нет?
в программах на Си++ крайне редко возникает нужда создавать глобальные объекты. Обычно создают "одиночки" (в том числе именованные). Методы проектирования в языках с ООП совсем другие, чем в Си. >>А может быть у Вас константный объект, а метод не константный. kObject->setVal() ?? и что? >>А префикс m_ для членов класса тоже нафиг? я использую только для классов, которые предназначены для наследования. Название: Re: как правильней писать указатель? Отправлено: igor_bogomolov от Октябрь 28, 2010, 17:19 Оу, какой замечательный холиварчик :)
Си такой же строго типизированный язык как и С++ В С++ есть полиморфизм, поэтому добавление информации о типе к имени переменной считаю бессмысленным. Добавление любых префиксов к имени переменной только усложняет читаемость кода (для всех, кроме автора). Никакой полезной информации они не несут. Мне, по крайней мере, она ни разу не пригодилась и вызывает только неприятие из-за того, что я должен постоянно добавлять какие то странные буковки. Особенно меня раздражает код на подобии такого Код Мне все равно какого стиля придерживается разработчик некой библиотеки (если не приходится в этом коде копаться), но не надо это выносить на поверхность. Я и так вижу какой у переменных тип. Зачем их дублировать в именах переменной? Почему я должен разбираться во всех этих префиксах и помнить их? Название: Re: как правильней писать указатель? Отправлено: ufna от Октябрь 28, 2010, 17:48 я иногда добавляю такие вещи только "для себя" внутри классов, в основном к bool и к int.
Пример функции как выше - это да, не айс, имхо. У троллей на этот счет имхо отличные примеры - там по функции понятно все. Название: Re: как правильней писать указатель? Отправлено: Alex_cs_gsp от Октябрь 28, 2010, 18:48 >>А может быть у Вас константный объект, а метод не константный. kObject->setVal() ?? и что? То, что для константного объекта только константный метод можно вызвать. Экономит время. В С++ есть полиморфизм, поэтому добавление информации о типе к имени переменной считаю бессмысленным. Полиморфизм, наоборот помогает делу. Полиморфизм имеет дело только с указателями и ссылками и никто вам не запрещает присваивать им соответствующий префикс, и соответственно знать тип объекта - базовый или производный. Хотя я сам очень редко использую в.н. для объектов. То что запоминать не хочется, это Ваши проблемы. Мне, например, код хочется дома лежа не диване надиктовывать. Название: Re: как правильней писать указатель? Отправлено: igor_bogomolov от Октябрь 28, 2010, 19:25 То что запоминать не хочется, это Ваши проблемы. Вы написали одну библиотеку используя свою нотацию. Кто то написал другую используя свой стиль префиксов. И т.д. А мне, предположим, по каким то причинам нужно эти библиотеки использовать. Так что мне все нотации помнить надо? Это же совершенно бесполезная информация. И это действительно становится проблемой. Только создают её те кто подобную нотацию использует. Мне, например, код хочется дома лежа не диване надиктовывать. Трудно представить этот поток согласных букв :-\Название: Re: как правильней писать указатель? Отправлено: lit-uriy от Октябрь 28, 2010, 19:28 >>То, что для константного объекта только константный метод можно вызвать. Экономит время.
Дак, если код я пишу, то я знаю каким объектом пользуюсь. Если код уже написан и не компилируется, то компилятор мне скажет и покажет, где ошибка. Мало того, я больше не практикую паскалевский подход - объявить пачку (константных) переменных в начале функции, а потом где-то использовать. Я объявляю (константную) переменную перед непосредственным использованием, поэтому я не успеваю забыть о ней. Если в чужом коде всё также, то для меня нет проблемы. И ещё, мне удобнее читать код буквально: object->show() - объект, показать в такой ситуации для меня становится проблематично чтение дополнительных буковок. П.С. До Qt, увлекался разными приёмами сокращений. А в программах на Си, ещё и всякие префиксы использовал (псевдо ООП, если так можно сказать) Название: Re: как правильней писать указатель? Отправлено: ufna от Октябрь 28, 2010, 19:29 Я бы с радостью надиктовывал, если бы был более высокоуровненый язык. К примеру, говорю компу - "добавь сюда список, обязательно иконки, загрузка данных из файла ..", а он понимает и делает :) аля комп из "Iron Man"
Название: Re: как правильней писать указатель? Отправлено: lenny от Февраль 11, 2011, 18:20 Венгерская нотация уже не в моде? Код: char *pchVar; А насчет того где должно быть * есть соображения char *pchVar1, *pchVar2 Если писать char*, то для второй переменной можно забыть указать * Возвращать ф-ей указатель, честно говоря, считаю плохим стилем, особенно когда это ф-и или методы, которые создают объекты в динамической памяти, хотя такое используется даже в QT. Ведь, возвращаемое значение можно проигнорировать, и если, например, возвращается адрес выделенной памяти, то могут возникнуть утечки. Так это противоречит такому объявлению Код:
Код:
Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 12, 2011, 00:32 Я и так вижу какой у переменных тип. Зачем их дублировать? +100. Это они с ассемблера притащили и вот до сих пор расстаться не могут ;D ;D ;D Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 12, 2011, 14:11 А что такое вообще "переменная" в языках Pascal, C, C++ ? Ее нет "как таковой", всегда есть "адрес". Вопрос только в том "читать/писать содержимое по адресу" или "менять (и) сам адрес".
Примерик Код Так правильно? :) Название: Re: как правильней писать указатель? Отправлено: shirushizo от Февраль 12, 2011, 18:29 Не помню как там с векторами, а вот с массивом еще проще:
Код: int *test = new int[elCount]; Код: test[5] Название: Re: как правильней писать указатель? Отправлено: lenny от Февраль 13, 2011, 12:51 Так это противоречит такому объявлению Совсем забыл про такую дурацкую возможность.Код:
Код:
Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 13, 2011, 16:31 Не помню как там с векторами, а вот с массивом еще проще: Ну с массивом-то все ясно, а вот правильно ли это для std::vector ?Название: Re: как правильней писать указатель? Отправлено: Fat-Zer от Февраль 13, 2011, 16:35 Не помню как там с векторами, а вот с массивом еще проще: Ну с массивом-то все ясно, а вот правильно ли это для std::vector ?Название: Re: как правильней писать указатель? Отправлено: shirushizo от Февраль 13, 2011, 22:14 ... А никто и не спорит, индусы не в почете, а писать главное однообразно.работать должно, но руки за такие выкрутасы лучше было бы оторвать от греха подальше :D А с точки зрения семантики - int *p; int * myclass::mefunc(); Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 13:38 работать должно, но руки за такие выкрутасы лучше было бы оторвать от греха подальше :D Что же я такого плохого сделал, чем нарушил требования языка? :)Название: Re: как правильней писать указатель? Отправлено: Fat-Zer от Февраль 14, 2011, 17:18 работать должно, но руки за такие выкрутасы лучше было бы оторвать от греха подальше :D Что же я такого плохого сделал, чем нарушил требования языка? :)Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 17:29 языка может и не нарушили, а вот инкапсуляцию просто растоптали... вы обратились ко внутренним структурам объекта, а ведь реализация вектора всегда может измениться. ИМХО хакерство и прикладное программирование(если не считать системное) не совместимы. ??? Так оператор(ы) [] возвращают ссылки на элемент вектора (в любой реализации) Код Так что, затем взять адрес "a" уже хакерство? :) Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 14, 2011, 17:47 А какой смысл в проверке?
Код
Название: Re: как правильней писать указатель? Отправлено: Fat-Zer от Февраль 14, 2011, 17:48 ??? Так оператор(ы) [] возвращают ссылки на элемент вектора (в любой реализации) смотря что вы будете с ним делать.. Код Так что, затем взять адрес "a" уже хакерство? :) я так ппонял, что вы будете им: а) обходить им вектор б) приводить его к указателю на что-нить другое и писать целую структуры в массив и разбирать её... в) какая-то старая сишная функция, которой нужен int* в качестве параметра на этом разумные причины кончаются и это всё ИМХО хакерство (ну быть может крове в). если вы знаете ещё адекватные причины, то можете поделиться... Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 14, 2011, 17:55 если вы знаете ещё адекватные причины, то можете поделиться... Код
кстати это допустимо по стандарту Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 18:00 А какой смысл в проверке? Тот что вектор может быть пустКод
смотря что вы будете с ним делать.. Поделюсья так ппонял, что вы будете им: а) обходить им вектор б) приводить его к указателю на что-нить другое и писать целую структуры в массив и разбирать её... в) какая-то старая сишная функция, которой нужен int* в качестве параметра на этом разумные причины кончаются и это всё ИМХО хакерство (ну быть может крове в). если вы знаете ещё адекватные причины, то можете поделиться... Код И что, oOut1, oOut2 не могут быть адресами элементов вектора(ов)? Вообще главная цель вектора - совместимость с "С" массивом (и для этого жертвуется многим). Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 14, 2011, 18:02 Цитировать write (fd, &vec Нигде в стандартах не оговаривается, что все элементы массива лежат в памяти друг за дружкой начиная с указанного адреса.
К тому же размерность будет vec.size()*sizeof(vec[0]) Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 14, 2011, 18:04 Цитировать write (fd, &vec Нигде в стандартах не оговаривается, что все элементы массива лежат в памяти друг за дружкой начиная с указанного адреса.
К тому же размерность будет vec.size()*sizeof(vec[0]) Очень даже оговаривается. Про размерность вы правы (просто я подразумевал vector <char>), Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 18:08 Цитировать write (fd, &vec Нигде в стандартах не оговаривается, что все элементы массива лежат в памяти друг за дружкой начиная с указанного адреса.
К тому же размерность будет vec.size()*sizeof(vec[0]) Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 14, 2011, 18:11 Цитировать Очень даже оговаривается. Будьте любезны, ткните носом.Цитировать Из "к тому же" вытекает что "друг за дружкой", т.к. невозможно поддерживать/заполнять "дырки" без всяких дополнительных данных. Это была ремарка. А вот что одно вытекает из другого, насколько мне известно, стандартами не оговаривается.Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 18:20 Немного др тема:
А есть ли (стандартный) контейнер с поддержкой прямого доступа (оператор []), но который лишен недостатков/громоздкости вектора (за счет того что к "С" массиву он не приводится)?. Мне такой часто бывает нужен. Спасибо Название: Re: как правильней писать указатель? Отправлено: Fat-Zer от Февраль 14, 2011, 18:22 А какой смысл в проверке? Тот что вектор может быть пустКод
Код
все примеры это функции в си-стиле и ИМХО правильнее было бы написать: Код а вообще одна функция - одно возвращаемое значение Цитировать Очень даже оговаривается. Будьте любезны, ткните носом.Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 14, 2011, 18:25 Цитировать Очень даже оговаривается. Будьте любезны, ткните носом.А вы так уверены, что и поискать лень? Времени нету сейчас. Вечером запощу. Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 14, 2011, 18:55 Цитировать А вы так уверены, что и поискать лень? Времени нету сейчас. Вечером запощу. Своими заявлениями вы мою уверенность поставили под сомнение.Поискал и наткнулся на C++ Standard Library Defect Report List (Revision D73) (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-defects.html#69), где есть "69. Must elements of a vector be contiguous? Section: 23.4.1 [vector] Status: TC1 Submitter: Andrew Koenig Opened: 1998-07-29 Last modified: 2010-10-29". Судя по дате изменения всё не так однозначно. Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 14, 2011, 19:25 Section: 23.4.1 [vector] Status: TC1 Submitter: Andrew Koenig Opened: 1998-07-29 Last modified: 2010-10-29". Судя по дате изменения всё не так однозначно. Это значит лишь то, что Эндрю Кёнег недоволен состоянием дел. Цитата из стандарта: Цитировать 23.2.4 Class template vector [lib.vector] 1 A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size(). жирным шрифтом выделенно ближе к концу. Что тут неоднозначного? Стандарт 2003 года, ISO/IEC 14882, он-лайн версии с ходу не нашёл. Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 14, 2011, 19:35 The elements of a vector are stored contiguously
На самом деле реализовать обратное действительно будет наверное трудно) Всё, спасибо, вопрос закрыт. Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 21:37 Не хочу навязываться, но мой еще "открыт".
Немного др тема: Ну может не совсем стандартный, а где-то в бусте или др. месте ?А есть ли (стандартный) контейнер с поддержкой прямого доступа (оператор []), но который лишен недостатков/громоздкости вектора (за счет того что к "С" массиву он не приводится)?. Мне такой часто бывает нужен. Спасибо Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 14, 2011, 21:45 Цитировать который лишен недостатков/громоздкости вектора (за счет того что к "С" массиву он не приводится) Получается, что исходя из стандарта С++ 2003, ISO/IEC 14882 эта проблема вас не должна волновать.Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 14, 2011, 21:51 Получается, что исходя из стандарта С++ 2003, ISO/IEC 14882 эта проблема вас не должна волновать. Наверное я неверно пояснил. Я готов смириться с тем что "С" массива из контейнера не получу. Но взамен хотелось бы чтобы контейнер не жрал память как конь и не менял адреса элементов когда ему вздумается. Есть ли такой?Название: Re: как правильней писать указатель? Отправлено: Anchorite от Февраль 16, 2011, 18:28 У std::vector есть конструктор, создающий вектор заданного размера все элементы которого инициализированны заданным значением.
Не вставляй и не удаляй из него элементы. Если необходимо получить из этого вектора массив - берешь адрес нулевого элемента. Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 16, 2011, 19:08 У std::vector есть конструктор, создающий вектор заданного размера все элементы которого инициализированны заданным значением. Молодые (но уже борзые) щенки обычно в таких случаях отвечают типа "А ты пост читал???" :)Не вставляй и не удаляй в него элементы. Если необходимо получить из этого вектора массив - берешь адрес нулевого элемента. Я попробую пояснить еще раз. Что делает стандартный вектор - я знаю. На "быстрое" удаление/вставку не претендую. Хочу просто чтобы контейнер "рос" по-умному. То что Вы описали правильно, но так мы недалеко ушли от С массива. Интерес добавлять новые элементы (в хвост) не заботясь о том "как это реализовано". (Q)Вектор это делает, но плохо: - push_back (N раз). В какой-то момент пул вектора закончился, надо пере-распределиться. Было 500 Mb данных - стало 750 (а я этого не просил). Хуже того - все элементы копируются их старых 500 в новые 750. Понятно что какая-то избыточность (пул) всегда неизбежны. Но почему нельзя сделать это по уму? Например - надо выделить память под следующий элемент а резерва уже нет. Ну выделил память для следующего блока элементов (не дергая уже имеющиеся) и не вычисляя новый размер "от фонаря" Thoughts? Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 16, 2011, 19:28 Понятно что какая-то избыточность (пул) всегда неизбежны. Но почему нельзя сделать это по уму? Например - надо выделить память под следующий элемент а резерва уже нет. Ну выделил память для следующего блока элементов (не дергая уже имеющиеся) и не вычисляя новый размер "от фонаря" Почему vector вынужден дергать имеющиеся элементы вроде не раз обсуждали. Это его минус, но у него есть и свои плюсы.Можно посмотреть на std::deque. Ну и недавно я уже писал про поиски идеального контейнера... нет таких! У каждого из них есть как свои плюсы, так и свои минусы. Поэтому приходиться все время выбирать какой контейнер в этом месте будет эффективней относительно его +/-. А в некоторых случаях писать свою реализацию контейнера и/или аллокатора. Название: Re: как правильней писать указатель? Отправлено: Пантер от Февраль 16, 2011, 19:41 Цитировать Ну выделил память для следующего блока элементов (не дергая уже имеющиеся) и не вычисляя новый размер "от фонаря" По стандарту, элементы в std::vector располагаются последовательно в памяти. Это переходное звено между си и с++. То, что ты хочешь, входит в противоречие со стандартом. Объемом памяти можешь управлять при помощи reserve или своего аллокатора. Вообще, ты уже переходишь с этой темой на уровень флуда.Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 16, 2011, 19:42 Ну и недавно я уже писал про поиски идеального контейнера... нет таких! У каждого из них есть как свои плюсы, так и свои минусы. Поэтому приходиться все время выбирать какой контейнер в этом месте будет эффективней относительно его +/-. Тот аллокатор напоминает мне старую песню с Extended/Expanded memory (если помните) :)А в некоторых случаях писать свою реализацию контейнера и/или аллокатора. Конечно я давно сделал свой контейнер который растет порциями, но, блин, обидно что такой реально необходимой вещи нет стандартной (заметим - исключительно для совместимости с С) Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 16, 2011, 19:44 Конечно я давно сделал свой контейнер который растет порциями, но, блин, обидно что такой реально необходимой вещи нет стандартной (заметим - исключительно для совместимости с С) Ну так опубликуй. ;) Весь мир ждет этот идеальный контейнер. Уверен, что уже в ближайшее время он попадет в boost, ну а потом и в стандарт.Название: Re: как правильней писать указатель? Отправлено: Пантер от Февраль 16, 2011, 19:45 Надо в stl пропихнуть std::vector++
Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 16, 2011, 19:59 Ну так опубликуй. ;) Весь мир ждет этот идеальный контейнер. Уверен, что уже в ближайшее время он попадет в boost, ну а потом и в стандарт. Надо в stl пропихнуть std::vector++ Ладно, какой вопрос(ы) - такой и ответ(ы).Ведь реализация блоками (по-ихнему "chunks") очевидна (если Вы конечно программисты а не только списывете чужие классы). Это известно задолго до STL и (мое мнение) - западло что в STL этого нет. Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 16, 2011, 20:06 Ведь реализация блоками (по-ихнему "chunks") очевидна (если Вы конечно программисты а не только списывете чужие классы). Это известно задолго до STL и (мое мнение) - западло что в STL этого нет. Ну есть же деки.Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 16, 2011, 20:31 Ну есть же деки. Ну сравнили палец с др. частью тела. Не хочу и обсуждатьНазвание: Re: как правильней писать указатель? Отправлено: BRE от Февраль 16, 2011, 20:35 Ну сравнили палец с др. частью тела. Не хочу и обсуждать Странно как-то получается.Из стандартного "все не то", даже обсуждать не хочешь (хотя я тоже не буду с тобой это обсуждать), свою "красоту" тоже не показываешь. В простонародье это называется просто Тролллллинг. Не? :) Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 16, 2011, 20:57 Странно как-то получается. Нет. Чего я буду со своей "красотой" налезать? Она ведь не от хорошей жизни а потому что "реально надо". С удовольствием бы попользовался чем-то стандартным. Так ведь нету. Хочу обсудить на форуме - дают советы типа "я ни разу не грамотный" :) Из стандартного "все не то", даже обсуждать не хочешь (хотя я тоже не буду с тобой это обсуждать), свою "красоту" тоже не показываешь. В простонародье это называется просто Тролллллинг. Не? :) Библия, Коран, Assistant и др. - все они великие книги, я согласен. Но всегда с тем развивается преследование/травля инакомыслящих. Ладно, я это переживу :) Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 16, 2011, 21:05 С удовольствием бы попользовался чем-то стандартным. Ну вы нам расскажите, чем дека-то не устраивает, а то мне вот тоже кажется, что она под ваши требования подходит. Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 16, 2011, 21:10 Нет. Чего я буду со своей "красотой" налезать? Она ведь не от хорошей жизни а потому что "реально надо". С удовольствием бы попользовался чем-то стандартным. Так ведь нету. Хочу обсудить на форуме - дают советы типа "я ни разу не грамотный" :) Каких инакомыслящих? Ты это о ком? Если о себе, то пока ты еще ничего не рассказал/показал. Так, одни намеки.Библия, Коран, Assistant и др. - все они великие книги, я согласен. Но всегда с тем развивается преследование/травля инакомыслящих. Ладно, я это переживу :) Я тебе серьезно предложил, покажи что у тебя есть, может оно действительно лучше всего что есть на сегодняшний момент. Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 16, 2011, 22:10 Я тебе серьезно предложил, покажи что у тебя есть, может оно действительно лучше всего что есть на сегодняшний момент. И в чем же Ваша "серьезность"? Вы продадите код и мы с Вами озолотимся? :) Хорошо если так, но что-то не очень верится (хотя дай бог). Ладно, вот реальный хедер в аттаче (не правил ни буквы). Конечно он труден для понимания - просто он делался не для продажи/красоты а потому что стандарт никак не устраивает.И не надо "ловить меня на слове" - я за свои слова отвечаю :) Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 16, 2011, 22:34 И в чем же Ваша "серьезность"? Вы продадите код и мы с Вами озолотимся? :) Хорошо если так, но что-то не очень верится (хотя дай бог). +1Ладно, вот реальный хедер в аттаче (не правил ни буквы). А чем твой контейнер отличается от дека, не считая ограниченного функционала?Кстати, Код а если размер чанка окажется не кратен размеру элемента, в конце каждого чанка будет болтаться неиспользуемый кусок памяти? Лучше размер чанка расчитывать от размера элемента. Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 16, 2011, 22:50 CChunkArray -- дека, только самодельная. А CChunkList, CSimpleList - вообще в stl/boost есть..
Edit: и все трое игнорируют конструкторы, что делает их юзабельными только для интов.. Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 17, 2011, 11:48 Дека значит deque, правильно? А Вы его щупали или просто так, хелп читали? :)
Прошу пояснить сколько элементов deque держит в одой "пачке" (подмассиве). Если стандартом это не оговаривается, на конкретной реализации популярного компилятора - напр MSVC2008 (который я обойти никак не могу). Спасибо Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 12:14 Дека значит deque, правильно? Ага.А Вы его щупали... Щупать деки???!!! Фуууу.... или просто так, хелп читали? :) Не знаю как остальные, но я хелп не читал, мне соседка во дворе рассказывала.Прошу пояснить сколько элементов deque держит в одой "пачке" (подмассиве). Если стандартом это не оговаривается, на конкретной реализации популярного компилятора - напр MSVC2008 (который я обойти никак не могу). Когда ты придумывал свой дек, тебя этот вопрос почему-то не особо интересовал. Что поменялось? ;)Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 13:04 Прошу пояснить сколько элементов deque держит в одой "пачке" (подмассиве). Если стандартом это не оговаривается, на конкретной реализации популярного компилятора - напр MSVC2008 (который я обойти никак не могу). Стандартом не оговаривается. В gcc 512 * sizeof (T), но можно настроить. Кстати, в бусте может есть более гибкий вариант. Edit: наврал, размер max (sizeof (T), 512), т.е. если sizeof (T) > 512, то в каждом чанке по одному элементу :( а если размер чанка окажется не кратен размеру элемента, в конце каждого чанка будет болтаться неиспользуемый кусок памяти? Да, но Igors выбирает размер исходя из размера системных страниц памяти. Это правильная экономия, в противовес мнимой экономии на последнем кусочке. При больших объёмах данных это имеет смысл. Благодаря этому комменту наконец понял, что хотел сказать Igors: дека при больших объёмах неоптимально распределяет память и это нельзя настроить. (в смысле надеюсь, что понял :)) Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 13:13 Да, но Igors выбирает размер исходя из размера системных страниц памяти. Это правильная экономия, в противовес мнимой экономии на последнем кусочке. При больших объёмах данных это имеет смысл. Давайте обсудим эту правильную экономию.В чем она заключается и причем здесь размер системных страниц памяти? Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 13:27 Edit: наврал, размер max (sizeof (T), 512), т.е. если sizeof (T) > 512, то в каждом чанке по одному элементу :( ::)А что тебя так расстроило? ;) Возьми любой свой проект и попробуй найти классы, объекты который > 512 байт и они хранятся у тебя в огромных количествах. Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 13:33 Да, но Igors выбирает размер исходя из размера системных страниц памяти. Это правильная экономия, в противовес мнимой экономии на последнем кусочке. При больших объёмах данных это имеет смысл. Давайте обсудим эту правильную экономию.В чем она заключается и причем здесь размер системных страниц памяти? Захват больших кусков памяти маллок осуществляет напрямую у системы (mmap на линукс, на винде virtualalloc или что-то такое). Поэтому любой большой кусок кратен размеру страницы. Память в хвосте этого куска не вернётся при других маллоках и никогда не используется. Пример: вызвали malloc (40961), система выделила round_up (40961 / 4096) = 11 страниц по 4096, последняя страница содержит полезный 1 байт, остальное никогда не используется, пока не вернётся системе по вызову free. Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 13:37 Edit: наврал, размер max (sizeof (T), 512), т.е. если sizeof (T) > 512, то в каждом чанке по одному элементу :( ::)А что тебя так расстроило? ;) Возьми любой свой проект и попробуй найти классы, объекты который > 512 байт и они хранятся у тебя в огромных количествах. Расстроил очередной подводный камушек о котором я не знал. А деки я практически не использую, не нужны обычно, Кроме того у Igors явно используется для POD-типов, поскольку нет поддержки конструкторов, а POD-типы обычно маленькие. Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 17, 2011, 13:40 Да, но Igors выбирает размер исходя из размера системных страниц памяти. Это правильная экономия, в противовес мнимой экономии на последнем кусочке. При больших объёмах данных это имеет смысл. Да, именно так. На гигабайтах даже 512 - кошкины слезы. Но то "еще цветочки". Благодаря этому комменту наконец понял, что хотел сказать Igors: дека при больших объёмах неоптимально распределяет память и это нельзя настроить. (в смысле надеюсь, что понял :)) Вот мелкософтовскмй бриллиант Код: _STD_BEGIN "ХЗ" чем думал ихний программист. Ну как можно было втулить размер единица что противоречит самой идее контейнера? Реально работает так Код
Edit: и все трое игнорируют конструкторы, что делает их юзабельными только для интов.. Для POD структур. Стандартный подход (new с указанием места) здесь не очень подходит. Как правило распределенные элементы все равно приходится заполнять и вызов тысяч конструкторов ни к чему.Пока не забыл Код За это в MSVC можно получить по рогам ("out of range" и все такое). В общем "резвый старт" и законное желание попользоваться готовым на деле отливаются тоннами потерянного времени Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 13:44 Захват больших кусков памяти маллок осуществляет напрямую у системы (mmap на линукс, на винде virtualalloc или что-то такое). Поэтому любой большой кусок кратен размеру страницы. Память в хвосте этого куска не вернётся при других маллоках и никогда не используется. Пример: вызвали malloc (40961), система выделила round_up (40961 / 4096) = 11 страниц по 4096, последняя страница содержит полезный 1 байт, остальное никогда не используется, пока не вернётся системе по вызову free. А ты проверь. ;)Код
И если будет интересно обсудим далее. Но менеджер памяти из libc ни про какие страниы не знает и работает с линейным куском памяти, который ему обеспечивает ядро. А вот ядро может оперировать кусками памятью только через страницы. Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 13:46 Вот мелкософтовскмй бриллиант По моему на всех заборах уже написано - не нужно пользоваться этой дрянью. :)Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 13:47 Код За это в MSVC можно получить по рогам ("out of range" и все такое). В общем "резвый старт" и законное желание попользоваться готовым на деле отливаются тоннами потерянного времени По стандарту это UB, имеют право хоть выдать "hello world". Я думаю в релиз-версии не упадёт и исключения не выкинет. Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 13:58 А ты проверь. ;) судя по отсутствию #include <iomanip> этот код даже не запускался.. Может вы сами проверите? (просто я уверен в результате) И если будет интересно обсудим далее. Но менеджер памяти из libc ни про какие страниы не знает и работает с линейным куском памяти, который ему обеспечивает ядро. А вот ядро может оперировать кусками памятью только через страницы. Это что-то непонятное. Какой-такой менеджер? Имеется ввиду malloc или кто? Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 14:03 судя по отсутствию #include <iomanip> этот код даже не запускался.. скопируй этот текст в файл - filename.cppвыполни g++ filename.cpp появится файлик a.out (запускаемый) запусти его посмотри/посчитай Может вы сами проверите? Я уже проверил.(просто я уверен в результате) Напрасно.Это что-то непонятное. Какой-такой менеджер? Имеется ввиду malloc или кто? Да. malloc + free - называется менеджером памяти.Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 14:15 Код: g++ ex.cpp всё с 32 бит не расстанетесь :) Код: [xxx@zzz ~]$ cat ex.cpp что и требовалось доказать. У вас-то на чём оно работает? Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 17, 2011, 14:17 Вот мелкософтовскмй бриллиант По моему на всех заборах уже написано - не нужно пользоваться этой дрянью. :)По стандарту это UB, имеют право хоть выдать "hello world". Я думаю в релиз-версии не так. То да, но ведь отлаживаться-то надо. Ну настроить это все конечно можно, но когда с десяток хороших (и чужих) static lib - наступает звериный кайф. Попробуйте откомпилить хоть одну либу "не так" - и sizeof самого контейнера не сбивается. И такие "вытекающие" что вначале только рот разеваешь :-[Еще деталька/вопрос: Стандартный контейнер(ы) испускает exception в случае отказа памяти. Это нормально/разумно, но не всегда устраивает. Напр. если я получил отказ я могу потеснить кэш или др. ресурсы и затем повторить. Словом мне надо чтобы возвращался NULL. "Одевать" каждый push_back в блок try/catch коряво (да и дорого). Какие есть решения? Спасибо Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 14:23 Блин, не то сообщение отредактировал. :)
Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 14:25 Да как будто я выбираю "пользоваться или нет" :'( Не обязательно пользоваться STL от microsoft. Есть и другие, вроде даже под VS.Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 14:37 Дома проверю еще на 64 битах. На убунту 10.10 64 бит работает как у вас, это интересно, не знаю как и объяснить. Словом мне надо чтобы возвращался NULL. "Одевать" каждый push_back в блок try/catch коряво (да и дорого). Какие есть решения? Многие методы не возвращают (void push_back), соответственно так сделать нельзя. Но можно переопределить аллокатор, чтобы он пытался лезьть в кэши и их чистить, а исключение кидалось только если почистить не получилось. Не очень хороший вариант, но лучше не знаю. Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 17, 2011, 14:42 Полемика насчет нюансов страниц, на мой взгляд, беспредметна. В свое время я проверял на своей платформе (Mac OSX) и получил те же результаты что и brankovic. Очень может быть что на др. платформе это не так, и что с того? Гораздо проще/практичнее допустить "неиспользуемые хвостики" (так или иначе они неизбежны) чем долго морочить себе голову в нюансах ОС которые могут и поменяться.
Вообще если структура 1K и более - с ней проблем не возникает, да просто вектор указателей - и все дела. Речь идет о примитивных данных которые однако могут поступать в громадных количествах - и с этим надо что-то делать. Название: Re: как правильней писать указатель? Отправлено: Кутенок от Февраль 17, 2011, 14:43 Код: #include <iostream> Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 17, 2011, 14:49 Цитировать Не все так однозначно. RHEL-x86:0x8fc7008 150761480 +7 0x8fd1010 150802448 +7 RHEL-x86_64: 0x502010 5251088 +15 0x50c020 5292064 +15 Цитировать На убунту 10.10 64 бит работает как у вас, это интересно, не знаю как и объяснить. Просто везде используются разные memory manager-ы. Про юбунту не скажу, а вот на FreeBSD свой и совсем не такой как в линуксе.Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 14:52 Код: #include <iostream> Ну так блок-то маленький, 100 байт всего -- неправильный пример. Вообще в обсуждении о том 'как на самом деле' и правда нет смысла, всё равно считается всё в страницах в конечном итоге. Если malloc не устраивает, то всегда можно прибегнуть к прямому захвату в обход malloc. Просто везде используются разные memory manager-ы. Про юбунту не скажу, а вот на FreeBSD свой и совсем не такой как в линуксе. На прошлой работе в центосах работало как я говорил. Кто такие вообще мемори менеджеры? Мы говорили о реализации malloc что в libc Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 17, 2011, 14:56 Цитировать Кто такие вообще мемори менеджеры? Мы говорили о реализации malloc что в libc Ну это и имелось в виду.Название: Re: как правильней писать указатель? Отправлено: Кутенок от Февраль 17, 2011, 16:31 Код: #include <iostream> Название: Re: как правильней писать указатель? Отправлено: brankovic от Февраль 17, 2011, 16:54 Вывод: нет выравнивания по страницам памяти вывод неправильный. Правильный вывод, что при размере блока в 4096 байт нет выравнивания. Проверять надо для реально большого блока, например 4096 * 1024. Кроме того надо делать не +8 а минус -8, поскольку выделенный блок имеет заголовок минимум в 8 байт. Для надёжности я бы сделал +-100. , но адреса выравниваются к границе 8 байт это свойство malloc, по стандарту он обязан возвращать память с выравниванием подходящим для любого типа на этой архитектуре. Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 16:59 Дома проверю еще на 64 битах. [/qoute] Цитировать [...]$ ./a.out 0x1150010 18153488 +15 0x115a020 18194464 +15 0x1164030 18235440 [...]$ g++ -v Используются внутренние спецификации. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.5.2/lto-wrapper Целевая архитектура: x86_64-unknown-linux-gnu Параметры конфигурации: /build/src/gcc-4.5-20110127/configure --prefix=/usr --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-gnu-unique-object --enable-lto --enable-plugin --enable-gold --with-plugin-ld=ld.gold --disable-multilib --disable-libstdcxx-pch --with-system-zlib --with-ppl --with-cloog --with-cloog-include=/usr/include/cloog-ppl --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info Модель многопоточности: posix gcc версия 4.5.2 20110127 (prerelease) (GCC) [...]$ Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 17, 2011, 17:17 вывод неправильный. Правильный вывод, что при размере блока в 4096 байт нет выравнивания. Проверять надо для реально большого блока, например 4096 * 1024. Кроме того надо делать не +8 а минус -8, поскольку выделенный блок имеет заголовок минимум в 8 байт. Для надёжности я бы сделал +-100. Мое мнение - Вы напрасно усложняете. Просто размер "реально выделенного (используемого)" + "служебные байты" должен быть кратен 4K, но не превышать его. Это легко сделать. Потеряли несколько байт - переживем, на chunk'е 64K это нормальноНазвание: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 17:20 Потеряли несколько байт - переживем, на chunk'е 64K это нормально А почему это нормально? Почему именно 64K это нормально, а 128К, 512К, это нормально или уже нет?Какой критерий? Название: Re: как правильней писать указатель? Отправлено: Кутенок от Февраль 17, 2011, 17:38 Цитировать #include <iostream> int main() { // XP, VS 2008 Express, свойства проекта по умолчанию // Объем используемой памяти в диспетчере задач: //int blockSize = 3*(4096-100); // 121496 КB int blockSize = 3*(4096+100); // 127536 KB for(int i = 0; i<10*1024; ++i) malloc(blockSize); std::cin.get(); return 0; } Идея о том, что когда машина увидит РЕАЛЬНО большой блок памяти, то перестанет мелочиться, кажется мне очень "человечной". Интересно, что если просто свернуть окно консоли, не завершая программы, то вся память освобождается. Как VS это делает? Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 17, 2011, 17:50 Цитировать Интересно, что если просто свернуть окно консоли, не завершая программы, то вся память освобождается. Как VS это делает? А что такое "просто свернуть окно консоли"?Название: Re: как правильней писать указатель? Отправлено: Кутенок от Февраль 17, 2011, 17:57 Я кликал на кнопочке с черточкой в правом верхнем углу окна консоли
Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 17, 2011, 17:58 А почему это нормально? Почему именно 64K это нормально, а 128К, 512К, это нормально или уже нет? Согласен, теоретически это полный "волюнтаризм (вы даете нереальные планы)". А по жизни как - ну тот же долбаный "irradiance cache" - да хз сколько точек придет, может гектар(ы) а может всего сотни. Разумно сделать запаску, типа "да, в худшем случае я потрачу 64К - ничего, переживу". Использование больших размеров (128, 512) сильно производительность не повысит. Какой критерий? Эх, Вам бы пилу/топор в руки (raytrace надо чувствовать), там бы охота к общим решениям улетучилась бы моментально :) Название: Re: как правильней писать указатель? Отправлено: BRE от Февраль 17, 2011, 18:17 Эх, Вам бы пилу/топор в руки (raytrace надо чувствовать) Да, лет десять уже как с графикой вообще и с трассировкой лучей в частности не связывался, а до этого ничего так, справлялся. там бы охота к общим решениям улетучилась бы моментально :) Я вовсе не противник своих велосипедов (уже не раз об этом пишу), только прежде чем писать свой велосипед, стоит посмотреть по сторонам и разобраться, а что люди уже сделали, как это работает и как это я могу улучшить. А без этого, как правило, получаются "кастрированные уродцы", которые можно использовать в одном конкретном месте.А вообще с графикой я начинал работать на машине с общим объемом памяти равным тому, что ты на каждом чанке готов просто выкидывать. Название: Re: как правильней писать указатель? Отправлено: GreatSnake от Февраль 17, 2011, 18:21 2 Igors
Пробовали STLport (http://sourceforge.net/projects/stlport/reviews/)? Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 18, 2011, 16:09 2 Igors Не знал о таком, спасибо за информацию. Но понимаете, если уж говорится "STL" то подразумевается стандарт и совместимость на любой платформе. А если надо еще что-то ставить (пусть и несложно) - теряются прелесть/выгоды стандартаПробовали STLport (http://sourceforge.net/projects/stlport/reviews/)? Я вовсе не противник своих велосипедов (уже не раз об этом пишу), только прежде чем писать свой велосипед, стоит посмотреть по сторонам и разобраться, а что люди уже сделали, как это работает и как это я могу улучшить. А без этого, как правило, получаются "кастрированные уродцы", которые можно использовать в одном конкретном месте. С этим никто не спорит. Я привел конкретный пример и не один резон почему вынужден был делать свой контейнер. Плохо смотрел по сторонам и разбирался? Может и так, покажите где и как лучше. А сразу переть на человека (мол, неграмотный, доки не читал) - ни к чему.А вообще с графикой я начинал работать на машине с общим объемом памяти равным тому, что ты на каждом чанке готов просто выкидывать. Да, были времена, но они прошли. Сейчас пользователь спрашивает "а что я буду иметь если поставлю 16Gb" - и глуповато хвастать что, мол, "мой софт и на 1 Mb работает как часы"Название: Re: как правильней писать указатель? Отправлено: Igors от Февраль 18, 2011, 16:38 Я вовсе не противник своих велосипедов (уже не раз об этом пишу) Так увидим ли мы наконец велосипед в Вашем исполнении? Может (симпатичная) соседка во дворе подскажет? :) А то пока только глухая догматуха и "следование канонам" :-\ |