![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
В Си есть функция calloc(), которая при динамическом выделении памяти инициализирует всё нулями. Есть ли такая же возможность при выделении памяти оператором new?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
Можно использовать функцию memset(). После выделения памяти заполните этот буфер нулями с помощью данной функции.
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Конкретно что тебе нужно инициализировать нулями? Класс?
Тогда memset -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
Свойства класса можно инициализировать в конструкторе класса, не прибегая к memset(). Если нужно инициализировать буфер - вот тогда memset().
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
опытным путем проверено, что
обнуляет все size элементов T, если T примитивный встроенный тип -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Компилятор\конфигурация? Подозреваю, что такое может быть только в Debug -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Спасибо за советы, с memset работает гораздо быстрее.
Инициализировал массив. Интересно, а если надо инициализировать массив структур и обнулить надо не все поля, как проще? Наверно, переквалифицировать в класс и прописать необходимую инициализацию в конструкторе? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
g++ 4.02 под Linux, конфигурация стандартная -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Neitron |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Это не стандарт. Так что пофигу что оно так в твоем компиляторе. Это сообщение отредактировал(а) Neitron - 28.12.2005, 14:13 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
| byNet |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 14.11.2005 Где: Беларусь Репутация: нет Всего: нет |
Да
|
|||
|
||||
| srd |
|
||||||||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Инициализировать объекта класса с помощью memset - это опасно.
Если я правильно понимаю п. 5.3.4/15 в стандарте, то для
элементы массива имеют неопределенное значение, а для
элементы массива инициализируются нулём. -------------------- Не смей читать мою подпись!!! |
||||||||||
|
|||||||||||
| blackofe |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
если учитывать, что класс от структуры ничем кроме видимости членов по-умолчанию не отличается, то инициализировать объекты класса не более опасно, чем объекты структур. имхо, надо смотреть в каждом конкретном случае. как по мне, я вообще не люблю инициализацию объектов memset'ом. использую только для массивов, и то редко.
за это огромное спасибо. страшно полезно вот так открывать для себя что-то новое. теперь мне memset и для массивов не нужен ;). |
||||||||
|
|||||||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
С помощью ключевого слова struct можно определить POD-структуру, а можно определить класс. Здесь я говорил про классы вообще, а не про те, что вводятся с помощью ключевого слова class.
Стандарт - вещь хорошая, но здесь надо смотреть на поведение конкретного компилятора Это сообщение отредактировал(а) srd - 29.12.2005, 06:38 -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| blackofe |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
базара для.
терминология. терминология. терминология. как я понял, ты под словом "класс" подразумевал non-POD class? потому что POD-class - вполне себе нормальный термин. а поскольку с помощью ключевого слова struct можно определить и POD-структуру и non-POD-структуру, то я бы все-таки говорил о том, что есть non-POD-структуры non-POD-классы POD-структуры POD-классы потому что класс, который класс, а не класс, тоже звучит как-то неубедительно. в конце концов, что такое класс? в стандарте есть такая фраза: "A class is a type." ну, так структура - тоже type. и int - тоже type. гради буч дает такое определение: "класс - это некое множество объектов, имеющих общую структуру и общее поведение." ну, в общем-то, любой тип сюда подходит - и фундаментальный, и сложный. кстати, в стандарте среди сложных (compound) типов нет структур, как я понимаю они подразумеваются под ключевым словом class.
можно сказать, что любой компилятор реализует стандарт в той или иной степени. и если он не реализует стандартное поведение new(), то это можно расценивать как ошибку. с другой стороны реализация memset также не застрахована от ошибок. так что тут дело вкуса. лично я предпочитаю new и delete всяким malloc и free. красивее, изящнее, и как результат - читабельнее, а значит, более застраховано от ошибок кодирования. |
||||
|
|||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Вообще-то кроме видимости членов по умолчанию, структуры от классов отличаются еще видимостью баз по умолчанию. ИМХО memset для объекта класса(или структуры) действительно опасно. Самая явная проблема - у класса могут быть виртуальные функции и/или виртуальные базы, с помощью memset'a мы испортим всю служебную информацию, хранящуюся в таком классе. Кроме того если в классе есть данные-члены указатели или вещественного типа, то обнулив этот класс memset'ом мы можем получить не то, что ожидали. Данные-члены вещественного типа не обязательно будут равны 0.0 (для IEEE754 это так, но это не единственный возможный формат), и для указателей тоже не гарантируется, что обнулив все биты мы получим указатель значение которого "null pointer value". --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |