![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| vinter |
|
||||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Всем привет,
есть код
для него VS2008 генерит следующий ассемблерный код
и есть следующий код
ассемблер
Теперь вопросы откуда разница между вызовом new и ::operator new, разве это не одно и то же? Я всегда считал, что с помощью new нельзя выделить память под void, а тут такое Заранее спасибо за ответы. |
||||||||
|
|||||||||
| UnrealMan |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Оттуда, что в первом случае ты выделяешь память под один объект int и инициализируешь его значением 4000, а во втором - выделяешь 4000 байт. Это не одно и то же.
Так оно и есть.
Функция operator new не обязана инициализировать память.
Функция operator new возвращает лишь указатель на выделенную память; указатель на объект конкретного типа возвращается new-выражением. |
||||||
|
|||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Собственно, new-выражение вызывает функцию operator new и передаёт ей свои аргументы. Первый аргумент - это всегда размер памяти, остальные аргументы (в случае их наличия) передаются в том же порядке, в котором они указаны в new-выражении. Т.е., например,
вернёт результат
преобразованный к T *. Инициализация может быть, а может и не быть - это зависит от нескольких факторов. Это сообщение отредактировал(а) UnrealMan - 23.12.2008, 22:41 |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
См. стандарт
Можно добавить, что ещё одним фактором является соответствие компилятора стандарту. Например, gcc 3.4.5 не инициализирует массив, создаваемый с помощью new int[5](), хотя по стандарту инициализация должна быть. Насколько я знаю, в новых версиях gcc это исправлено. Это сообщение отредактировал(а) UnrealMan - 24.12.2008, 15:15 |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
еще раз спасибо
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |