powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация структуры
11 сообщений из 61, страница 3 из 3
инициализация структуры
    #34993225
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков TubrikВот хочу, чтобы вы поразмышляли над сущность "ТОЧКА".

+1
...
Рейтинг: 0 / 0
инициализация структуры
    #34993347
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh

1. Использовать memset() опасно, т.к. нет гарантии, что в какой-то момент в структуру не придется включить тип данных, который корректно сбрасывается не нулями.
2. Если в структуре много переменных представьте размер конструктора. К тому же конструктор лишит возможности использовать инициализацию типа = {x1, x2, ..., xn}, значит придется делать еще один конструктор, принимающий переменные, не меньшего размера.
Насколько проще использовать вариант, предложенный Анатолием использовать глобальный объект:

Код: plaintext
1.
2.
3.
4.
5.
const stStruct& ZeroStruct()
{
	static const stStruct zero_obj;
	return zero_obj;
}

разве не так? Пускай даже эта ф-ия будет частью структуры, которую она обнуляет, но даже так будет кратче, чем использовать конструкторы. А если нужно "обнулять" не нулями, то можно аналогично:
Код: plaintext
1.
2.
3.
4.
5.
const stStruct& ZeroStruct(const int a, const int b)
{
	static const stStruct zero_obj = {a, b};
	return zero_obj;
}
...
Рейтинг: 0 / 0
инициализация структуры
    #34993413
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik

1. Только для тех, где есть гарантия и используй. Кстати, в таких обычно и функций нет.

2. Одна крайнасть хороша, и другая хороша, а истина где-то посередине. Задачу можно решить разными способами, но для конкретного применения один способ более подходящий чем другой. Ты решил, что я против мемсета? Интересно где это я написал, вроде бы пишу обратное. ;) Еще к вопросу с большим количеством свойств можно добавить, что зачастую тут имеют место для жизни вложенные структуры, далее - иерархии наследования, далее - аналогичные данные - аналогичные структруры.

3. Ну, почему бы нет. Статическая зерроинициализация - тоже один из вариантов реализации, следовательно и он имеет право на жизнь.
Кстати, опять же вопрос - а не отменят ее в будущем? Сомневаюсь, конечно, но могут придумать какой-нибудь спецификатор - zero, и если его не указать, то будет мусор. Врядли, конечно, - не такая уж она и напряжная.

"К людям надо мягше, а на вопросы смотреть ширше". ;)
...
Рейтинг: 0 / 0
инициализация структуры
    #34993455
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
против memset() уже я сам стал :)
вряд ли отменят или сделают что-то, что создаст серьезные проблемы при компиляции уже имеющихся сырцов, скорее могут добавить что-то новое

думаю тема исчерпана, всем спасибо за участие)
...
Рейтинг: 0 / 0
инициализация структуры
    #34994281
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik wrote:

> Синтаксис С++ не обязывает писать имена переменных класса с "m_",
> имена классов с большой буквы, и т.д. и т.п., но некоторые так делают,
> и я в их числе.
Ну а я не делаю :) Посмотри исодники Qt4 - там этого (ИМХО) маразма нет.
Хотя *иногда* это может быть удобно.

> Я не считаю, что "порчу" С++ или как-то ограничиваю его подвижность, а
> просто выбираю более удобное слово для использования, чтобы более
> точно (для себя) отразить замысел какого-то момента.
Класс и структура идентичны (можешь считать, что struct - это хитрый
макрос, который добавляет к классу public: доступ). Так что "замысел
момента" ты придумываешь :).

Ну и лично я считаю, что повесив правило на язык, ты лишаешь себя
возможности наломать дров и научиться чему-то новому в результате.

> Какой-то (не помню) автор книги по правилам "хорошего" тона в С++
> сказал, что этот язык слишком уж гибкий, чтобы не вводить подобные
> ограничения. По-твоему все эти книги с рекомендациями можно смело в
> топку?
Да. Книгу берем, читаем, обдумываем позицию автора, соглашаемся или не
соглашаемся с ней, затем берем что-то, что удобно/полезно лично мне, а
все остальное посылаем нафиг. Гибкость не для создания правил, а для
нахождения удобного тебе способа написания программ. А правила будут
слишком статичными, тем более не для всех задач они подходят. Ну нельзя
следовать одному какому-то "единственно верному" принципу. Так же нет
смысла везде использовать ООП или "не ООП" программирование и т.д. и
т.п.

> против memset() уже я сам стал :)
Знаешь, создатели Open Dynamics Engine (или похожей библиотеки) однажду
ругались, что VC++ какой-то версии, при создании массива структур или
классов, для каждой из них *вызывает* *пустой* конструктор, причем для
каждого элемента (это если такой есть) или делает что-то похожее.
Теперь прикинь количество вызовов функций при размере массива в
несколько десятков миллионов элементов. Это вызывало тормоза. С
memset'ом таких проблем не было. Вот и думай :) Все от ситуации
зависит.

--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34994397
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV

> против memset() уже я сам стал :)
Знаешь, создатели Open Dynamics Engine (или похожей библиотеки) однажду
ругались, что VC++ какой-то версии, при создании массива структур или
классов, для каждой из них *вызывает* *пустой* конструктор, причем для
каждого элемента (это если такой есть) или делает что-то похожее.
Теперь прикинь количество вызовов функций при размере массива в
несколько десятков миллионов элементов. Это вызывало тормоза. С
memset'ом таких проблем не было. Вот и думай :) Все от ситуации
зависит.

Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну тогда протестируй:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
struct info {
    int i;
    double d;
    float f;
};

info i;

memset(&i, sizeof(i),  0 );

против

i.i =  0 ;
i.d =  0 ;
i.f =  0 ;

...
Рейтинг: 0 / 0
инициализация структуры
    #34994452
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков wrote:

> Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну
> тогда протестируй:
Можно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз
войти/выйти в процедуру, или заполнить диапазон нулями одной
процедурой. Но мне почему-то лень этим заниматсья.
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
инициализация структуры
    #34994461
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVМожно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз
войти/выйти в процедуру, или заполнить диапазон нулями одной
процедурой. Но мне почему-то лень этим заниматсья.

Не одной быстротой сыт код.

ЗЫ: по мотивам пословицы.
...
Рейтинг: 0 / 0
инициализация структуры
    #34994462
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
Анатолий Широков wrote:

> Ага, щаз. То есть, memset - это дармовая функция, по вашему? А ну
> тогда протестируй:
Можно устроить бенчмарк и сравнить, что будет быстрее - 1000000 раз
войти/выйти в процедуру, или заполнить диапазон нулями одной
процедурой. Но мне почему-то лень этим заниматсья.
--
We are all going to hell and I'm driving the bus
Posted via ActualForum NNTP Server 1.4

Вот и славно, поэтому не надо голословными утверждениями (вы не привели точной ссылки) вводить в заблуждение о полезности memset - поскольку на самом деле, практика показывает, что применение memset весьма ограничено и это использование всегда на гране фола, в отличие от штатных средств языка C++.
...
Рейтинг: 0 / 0
инициализация структуры
    #34994474
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широков
Ага, щаз. То есть, memset - это дармовая функция, по вашему?


не тестировал, но в случае с >при размере массива в несколько десятков миллионов элементов, думаю, все же будет выигрыш, т.к. в memset() для обнуления не нужно использовать косвенную адресацию для вызова эти конструкторов или нечто подобное, но тут мы остановились не на "каждоразовом" вызове пустого конструктора, а на побитовом копировании готового объекта, кажется есть разница?

ErV
Так что "замысел
момента" ты придумываешь :).

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

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

тоже верно, на любое правило есть исключение, если будет нужно очень, я нарушу их, поэтому предпочту называть их не правилами, а рекомендациями, применимыми в большем кол-ве случаев
...
Рейтинг: 0 / 0
инициализация структуры
    #34994502
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrik Анатолий Широков
Ага, щаз. То есть, memset - это дармовая функция, по вашему?


не тестировал, но в случае с >при размере массива в несколько десятков миллионов элементов, думаю, все же будет выигрыш, т.к. в memset() для обнуления не нужно использовать косвенную адресацию для вызова эти конструкторов или нечто подобное, но тут мы остановились не на "каждоразовом" вызове пустого конструктора, а на побитовом копировании готового объекта, кажется есть разница?



Как я понял автора, мы не сравниваем вызов memset для всех 100000 элементов, а сравнимаем что лучше:

zero-инициализация средствами компилятора

против

memset для тойже структуры, то memset явно проигрывает.

Если речь идет о занулении массива из 1000000 POD объектов средствами memset, то memset, конечно, "рулит".
...
Рейтинг: 0 / 0
11 сообщений из 61, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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