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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация памяти при выделении, new vs. calloc 
:(
    Опции темы
ksili
Дата 27.12.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В Си есть функция calloc(), которая при динамическом выделении памяти инициализирует всё нулями. Есть ли такая же возможность при выделении памяти оператором new?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
adonin
Дата 27.12.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно использовать функцию memset(). После выделения памяти заполните этот буфер нулями с помощью данной функции.
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
Neitron
Дата 27.12.2005, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

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



Конкретно что тебе нужно инициализировать нулями? Класс?
Тогда memset


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
adonin
Дата 27.12.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Свойства класса можно инициализировать в конструкторе класса, не прибегая к memset(). Если нужно инициализировать буфер - вот тогда memset().
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
MAKCim
Дата 27.12.2005, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



опытным путем проверено, что
Код

T* array=new T [size];

обнуляет все size элементов T, если T примитивный встроенный тип


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
DeadSoul
Дата 27.12.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Цитата(MAKCim @ 27.12.2005, 22:00)
опытным путем проверено, что
код C++
1:
T* array=new T [size];
обнуляет все size элементов T, если T примитивный встроенный тип

Компилятор\конфигурация? Подозреваю, что такое может быть только в Debug



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
ksili
Дата 28.12.2005, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Спасибо за советы, с memset работает гораздо быстрее.
Инициализировал массив. Интересно, а если надо инициализировать массив структур и обнулить надо не все поля, как проще? Наверно, переквалифицировать в класс и прописать необходимую инициализацию в конструкторе?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MAKCim
Дата 28.12.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Компилятор\конфигурация? Подозреваю, что такое может быть только в Debug


g++ 4.02 под Linux, конфигурация стандартная


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

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



Цитата(MAKCim @ 28.12.2005, 12:16)
Цитата

Компилятор\конфигурация? Подозреваю, что такое может быть только в Debug


g++ 4.02 под Linux, конфигурация стандартная

Это не стандарт. Так что пофигу что оно так в твоем компиляторе.

Это сообщение отредактировал(а) Neitron - 28.12.2005, 14:13


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
byNet
Дата 28.12.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Нереварин
**


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

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



Цитата(Neitron @ 27.12.2005, 19:12)
Конкретно что тебе нужно инициализировать нулями? Класс?
Тогда memset

Инициализировать объекта класса с помощью memset - это опасно.

Цитата(MAKCim @ 28.12.2005, 05:00)
опытным путем проверено, что
Код

T* array=new T [size];    

обнуляет все size элементов T, если T примитивный встроенный тип

Если я правильно понимаю п. 5.3.4/15 в стандарте, то для
Код

// T - примитивный тип
T* array = new T[size];

элементы массива имеют неопределенное значение, а для
Код

// T - примитивный тип
T* array = new T[size]();

элементы массива инициализируются нулём.





--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
blackofe
Дата 28.12.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(srd @ 28.12.2005, 16:48)
Инициализировать объекта класса с помощью memset - это опасно.

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

как по мне, я вообще не люблю инициализацию объектов memset'ом. использую только для массивов, и то редко.

Цитата(srd @ 28.12.2005, 16:48)
Если я правильно понимаю п. 5.3.4/15 в стандарте, то для
Код

// T - примитивный тип
T* array = new T[size];

элементы массива имеют неопределенное значение, а для
Код

// T - примитивный тип
T* array = new T[size]();

элементы массива инициализируются нулём.

за это огромное спасибо. страшно полезно вот так открывать для себя что-то новое.

теперь мне memset и для массивов не нужен ;).
PM MAIL   Вверх
srd
Дата 29.12.2005, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Цитата(blackofe @ 29.12.2005, 03:29)
если учитывать, что класс от структуры ничем кроме видимости членов по-умолчанию не отличается, то инициализировать объекты класса не более опасно, чем объекты структур. имхо, надо смотреть в каждом конкретном случае.

С помощью ключевого слова struct можно определить POD-структуру, а можно определить класс. Здесь я говорил про классы вообще, а не про те, что вводятся с помощью ключевого слова class.

Цитата(blackofe @ 29.12.2005, 03:29)
за это огромное спасибо. страшно полезно вот так открывать для себя что-то новое.

теперь мне memset и для массивов не нужен ;).

Стандарт - вещь хорошая, но здесь надо смотреть на поведение конкретного компилятора smile memset'ом как-то надёжнее.

Это сообщение отредактировал(а) srd - 29.12.2005, 06:38


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
blackofe
Дата 29.12.2005, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



базара для.

Цитата(srd @ 29.12.2005, 06:38)
С помощью ключевого слова struct можно определить POD-структуру, а можно определить класс. Здесь я говорил про классы вообще, а не про те, что вводятся с помощью ключевого слова class.

терминология. терминология. терминология.

как я понял, ты под словом "класс" подразумевал 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.

Цитата(srd @ 29.12.2005, 06:38)
Стандарт - вещь хорошая, но здесь надо смотреть на поведение конкретного компилятора smile memset'ом как-то надёжнее.

можно сказать, что любой компилятор реализует стандарт в той или иной степени. и если он не реализует стандартное поведение new(), то это можно расценивать как ошибку. с другой стороны реализация memset также не застрахована от ошибок. так что тут дело вкуса. лично я предпочитаю new и delete всяким malloc и free. красивее, изящнее, и как результат - читабельнее, а значит, более застраховано от ошибок кодирования.
PM MAIL   Вверх
LPBOY
Дата 30.12.2005, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(blackofe @ 28.12.2005, 20:29)
если учитывать, что класс от структуры ничем кроме видимости членов по-умолчанию не отличается, то инициализировать объекты класса не более опасно, чем объекты структур. имхо, надо смотреть в каждом конкретном случае.

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

ИМХО memset для объекта класса(или структуры) действительно опасно.
Самая явная проблема - у класса могут быть виртуальные функции и/или виртуальные базы, с помощью memset'a мы испортим всю служебную информацию, хранящуюся в таком классе.

Кроме того если в классе есть данные-члены указатели или вещественного типа, то обнулив этот класс memset'ом мы можем получить не то, что ожидали. Данные-члены вещественного типа не обязательно будут равны 0.0 (для IEEE754 это так, но это не единственный возможный формат),
и для указателей тоже не гарантируется, что обнулив все биты мы получим указатель значение которого "null pointer value".
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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