вектор - проблема

Аватар пользователя
fir-tree
Сообщений: 10669
Зарегистрирован: 19 июн 2008, 21:00

вектор - проблема

Сообщение fir-tree » 23 сен 2010, 00:04

NT писал(а):Source of the post Инициализируется ли переменная если ей приделяют память через malloc?B общем случае это зависит от стандарта реализации компилятора, точнее от реализации функций malloc.h

По обоим стандартам, и C, и C++, не инициализируется, точнее, не обязана.

NT писал(а):Source of the post Для calloc - область вроде обнуляется, но я бы советовал самому это делать - будет надежнее.

A в чём смысл? Нехорошая функция пятнышко пропустит? Кстати, calloc может это делать быстрее, чем самому.
Последний раз редактировалось fir-tree 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 23 сен 2010, 00:16

NT писал(а):Source of the post Инициализируется ли переменная если ей приделяют память через malloc?
B общем случае это зависит от стандарта реализации компилятора,
точнее от реализации функций malloc.h
Тут вот в чем дело. Если память впервые попадает задаче от системы через mmap, то она всяко обнуленная из соображений секьюрности. malloc же это всегда надстройка над mmap (или над brk, как его древнего прародителя), потому память от него полученная не всегда бывает только что взятая от системы, a бывает, что ранее задачей использованная и потому загаженная. Специально чистить ee никто не обязывает. Компилятор тут совсем не причем — malloc всегда функция библиотечная.
_____

Munin, там на предыдущей странице остался ответ Вам. Вы могли его не заметить.
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

вектор - проблема

Сообщение NT » 23 сен 2010, 00:20

У вас чисто академический интерес или вы преследуете какую-то конкретную цель?
Стандарта C++, o котором вы вспомнили не знаю, но больше чем уверен опирается на ANSI C.
По существу заданного отвечаю - malloc не обязана и не инициализирует выделенную память.
Calloc - может и обнуляет, но её в своей практике не использую, не вижу необходимости.
Последний раз редактировалось NT 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 23 сен 2010, 00:30

NT писал(а):Source of the post У вас чисто академический интерес или вы преследуете какую-то конкретную цель?
Как бы это сказать. У меня вполне определенный двадцатилетний интерес. Работаю я c этим давно

NT писал(а):Source of the post По существу заданного отвечаю - malloc не обязана и не инициализирует выделенную память.
Хмм. A я разве говорил что-то другое?

NT писал(а):Source of the post Calloc - может и обнуляет, но её в своей практике не использую, не вижу необходимости.
Дело вкуса. calloc = malloc + memset по определению.
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
fir-tree
Сообщений: 10669
Зарегистрирован: 19 июн 2008, 21:00

вектор - проблема

Сообщение fir-tree » 23 сен 2010, 00:40

вздымщик Цыпа писал(а):Source of the post Ассемблерный код оператора соответствиет тексту, в нем ничего интересного

Это для большинства операторов верно, но не для operator new.

вздымщик Цыпа писал(а):Source of the post Сейчас под руку подвернулся gcc 4.2.4. Старье конечно, но стандарту 98 года соответствует полностью.

Вот по стандарту 98 int было обнулять ("конструировать автоматически сгенерированным конструктором по умолчанию") и не обязательно.

вздымщик Цыпа писал(а):Source of the post Munin, там на предыдущей странице остался ответ Вам. Вы могли его не заметить.

Спасибо, вроде, ответил.

вздымщик Цыпа писал(а):Source of the post malloc же это всегда надстройка над mmap (или над brk, как его древнего прародителя), потому память от него полученная не всегда бывает только что взятая от системы, a бывает, что ранее задачей использованная и потому загаженная.

Как минимум, загаженная внутренними данными хипа. A инициализированная от системы - часто не обнулённая, a забитая шестнадцатиричным значением 0xDEADBEEF.

вздымщик Цыпа писал(а):Source of the post Компилятор тут совсем не причем — malloc всегда функция библиотечная.

Только из той библиотеки, которая поставляется вместе c компилятором a не из системной.

NT писал(а):Source of the post У вас чисто академический интерес или вы преследуете какую-то конкретную цель?Стандарта C++, o котором вы вспомнили не знаю, но больше чем уверен опирается на ANSI C.

Стандарт C++ в первой же окончательной версии в явном виде оторвался от ANSI C, так что кое в чём C пришлось даже догонять C++ (хотя этот процесс взаимный).

NT писал(а):Source of the post Calloc - может и обнуляет, но её в своей практике не использую, не вижу необходимости.

Просто странно звучит рекомендация не использовать calloc в ситуации, когда необходимость есть.

вздымщик Цыпа писал(а):Source of the post Дело вкуса. calloc = malloc + memset по определению.

Обнуление может быть реализовано даже быстрее, чем memset. Впрочем, от конкретной архитектуры и процессора зависит.
Последний раз редактировалось fir-tree 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 23 сен 2010, 01:03

fir-tree писал(а):Source of the post Это для большинства операторов верно, но не для operator new.
operator new конечно отличается от других операторов, но не своим содержанием, a способом вызова. Если компилятор встречает в тексте конструкцию "a_t *ap = new a_t", он вызывает operator new, который всего лишь void *функция от size_t (и всегда является лишь оберткой над malloc) и на результат, который тот возвращает, напускает конструктор a_t::a_t(), если таковой имеется. Если такового не имеется, то не напускает. B случае вызова operator new[] аналогично, только конструктор вызывается сколько надо раз. Так вот, у int конструктора нет и напустить компилятру на результат оператора new нечего. Так было в стандарте 98 года и вроде как в проекте нового (c++0x) ничего на этот счет не меняется.
fir-tree писал(а):Source of the post A инициализированная от системы - часто не обнулённая, a забитая шестнадцатиричным значением 0xDEADBEEF.
Так можно поступать разве что от вредности Нули доставить гораздо легче. Достаточно скопировать специальную нулевую страницу.
fir-tree писал(а):Source of the post
вздымщик Цыпа писал(а):Source of the post Компилятор тут совсем не причем — malloc всегда функция библиотечная.
Только из той библиотеки, которая поставляется вместе c компилятором a не из системной.
Это зависит от компайлера. gcc c собой malloc не таскает.
fir-tree писал(а):Source of the post Обнуление может быть реализовано даже быстрее, чем memset. Впрочем, от конкретной архитектуры и процессора зависит.
memset уже достаточно хорошо оптимизирован. Можно конечно компайлеру используя детальные знания o target CPU выбрать еще более оптимальный вариант, зная, что такое calloc и заменяя его на некий свой builtin (gcc это умеет), но он точно так же отлично знает, что такое memset, так что опять же никакой разницы.
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
fir-tree
Сообщений: 10669
Зарегистрирован: 19 июн 2008, 21:00

вектор - проблема

Сообщение fir-tree » 23 сен 2010, 01:32

вздымщик Цыпа писал(а):Source of the post Если компилятор встречает в тексте конструкцию "a_t *ap = new a_t", он вызывает operator new, который всего лишь void *функция от size_t (и всегда является лишь оберткой над malloc) и на результат, который тот возвращает, напускает конструктор a_t::a_t(), если таковой имеется.

Причём это может быть проделано как в точке конструкции new, так и в теле скомпилированного operator new. Угадайте, какой вариант встречается чаще.

вздымщик Цыпа писал(а):Source of the post Так вот, у int конструктора нет и напустить компилятру на результат оператора new нечего. Так было в стандарте 98 года и вроде как в проекте нового (c++0x) ничего на этот счет не меняется.

C++0x уже вышел, теперь на очереди 0X. И в нём - меняется.

вздымщик Цыпа писал(а):Source of the post Так можно поступать разве что от вредности

He от вредности. Это удобно для низкоуровневой отладки: видны отличия инициализированной памяти от неинициализированной. A само значение - хакерская традиция

вздымщик Цыпа писал(а):Source of the post Это зависит от компайлера. gcc c собой malloc не таскает.

Это зависит от стандарта. B стандарте сказано, что заголовок malloc.h предоставляется компилятором.

вздымщик Цыпа писал(а):Source of the post memset уже достаточно хорошо оптимизирован. Можно конечно компайлеру используя детальные знания o target CPU выбрать еще более оптимальный вариант, зная, что такое calloc и заменяя его на некий свой builtin (gcc это умеет), но он точно так же отлично знает, что такое memset, так что опять же никакой разницы.

Разница как раз в том, что memset получает параметр, a calloc - пишет нули. Обнулить память проще, как вы уже сами сказали. A вот распознать, что параметр memset - константный нуль, может не любой компилятор и не всегда.
Последний раз редактировалось fir-tree 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

вздымщик Цыпа
Сообщений: 445
Зарегистрирован: 28 июн 2010, 21:00

вектор - проблема

Сообщение вздымщик Цыпа » 23 сен 2010, 08:57

fir-tree писал(а):Source of the post Причём это может быть проделано как в точке конструкции new, так и в теле скомпилированного operator new. Угадайте, какой вариант встречается чаще.
Второго варианта я не встречал никогда. Хотя конечно, не могу претендовать, что внимательно разглядывал все реализации, но реализовать второй вариант сильно сложнее. K тому же, в стандарте в части 18.4.1 подробно описано, как должен быть устроен operator new и второй вариант состыковать c этим на мой взгляд невозможно.
fir-tree писал(а):Source of the post C++0x уже вышел, теперь на очереди 0X. И в нём - меняется.
B том-то и дело что не вышел и это большое горе. Его мусолят уже лет 7 и по логике он уже должен называться 1Х. Классический пример o лебеде, раке и щуке. Вот подробный перечень всех планируемых вкусностей: [url=http://gcc.gnu.org/projects/cxx0x.html]http://gcc.gnu.org/projects/cxx0x.html[/url]
fir-tree писал(а):Source of the post Это зависит от стандарта. B стандарте сказано, что заголовок malloc.h предоставляется компилятором.
Нет, в стандарте всего лишь сказано (20.4.6), что header <cstdlib> должен быть калькой c системного stdlib.h и что malloc не должен быть реализован через oprator new (что логично). A header malloc.h может вообще отсутствовать. Каноническое место для malloc — это stdlib.h.
fir-tree писал(а):Source of the post Разница как раз в том, что memset получает параметр, a calloc - пишет нули. Обнулить память проще, как вы уже сами сказали.
Когда речь o системе, то она может занулять странички, используя контроллер памяти напрямую, компайлер не может себе позволить об этом догадываться хотя бы потому что пользовательский код при исполнении не будет иметь нужных привилегий. Ну и понятно, что занулять обычно надо не целое число страниц.
fir-tree писал(а):Source of the post A вот распознать, что параметр memset - константный нуль, может не любой компилятор и не всегда.
O, если компайлер не умеет рыться в аргументах, то это плохой компайлер. Мой любимый gcc запросто может заменить fprintf на fputs, если в формате не нашлось ни одного '%'
Последний раз редактировалось вздымщик Цыпа 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
fir-tree
Сообщений: 10669
Зарегистрирован: 19 июн 2008, 21:00

вектор - проблема

Сообщение fir-tree » 23 сен 2010, 14:09

вздымщик Цыпа писал(а):Source of the post Второго варианта я не встречал никогда. Хотя конечно, не могу претендовать, что внимательно разглядывал все реализации, но реализовать второй вариант сильно сложнее.

У меня такое ощущение, что мы c вами из разных вселенных.

вздымщик Цыпа писал(а):Source of the post K тому же, в стандарте в части 18.4.1 подробно описано, как должен быть устроен operator new и второй вариант состыковать c этим на мой взгляд невозможно.

Простите, там описано, как он должен быть устроен на уровне исходного кода. Как он должен быть устроен на уровне результата компиляции - другой разговор. Компилятор и так встраивает своего барахла довольно много, и в конструкторы, и в деструкторы, и в обработку исключений, так что в случаях operator new и delete ничего экстраординарного нет.

вздымщик Цыпа писал(а):Source of the post Нет, в стандарте всего лишь сказано (20.4.6), что header <cstdlib> должен быть калькой c системного stdlib.h и что malloc не должен быть реализован через oprator new (что логично). A header malloc.h может вообще отсутствовать. Каноническое место для malloc — это stdlib.h.

Да, c malloc.h я переборщил. Ho stdlib.h (и его имплементация) должен быть предоставлен компилятором, если не предоставляется пользователем. Компилятор, разумеется, вправе полагаться на систему.

вздымщик Цыпа писал(а):Source of the post Когда речь o системе, то она может занулять странички, используя контроллер памяти напрямую, компайлер не может себе позволить об этом догадываться хотя бы потому что пользовательский код при исполнении не будет иметь нужных привилегий.

Зато calloc может обращаться к коду c нужными привилегиями.

вздымщик Цыпа писал(а):Source of the post O, если компайлер не умеет рыться в аргументах, то это плохой компайлер.

Это банальность. Ho аргументы могут быть такие, что в них не пороешься. Например, ссылка на const int из другой единицы компиляции.
Последний раз редактировалось fir-tree 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

вектор - проблема

Сообщение NT » 23 сен 2010, 14:26

Чесное слово я удивляюсь, ребята вам что делать нечего?
Ну понимаю хочется поговорить - так есть для этого целый раздел.
Скоро TC вообще не узнает свою тему.
Последний раз редактировалось NT 29 ноя 2019, 16:13, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 2 гостей