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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> operator new 
V
    Опции темы
vinter
Дата 23.12.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Всем привет,

есть код
Код

 int * positionX =  new int(4000);

для него VS2008 генерит следующий ассемблерный код
Код

00401916  push        4    
00401918  call        operator new (40B3F0h) 
0040191D  add         esp,4 
00401920  mov         dword ptr [ebp-8],eax 
00401923  cmp         dword ptr [ebp-8],0 
00401927  je          main+2Ah (40193Ah) 
00401929  mov         eax,dword ptr [ebp-8] 
0040192C  mov         dword ptr [eax],0FA0h 
00401932  mov         ecx,dword ptr [ebp-8] 
00401935  mov         dword ptr [ebp-0Ch],ecx 
00401938  jmp         main+31h (401941h) 
0040193A  mov         dword ptr [ebp-0Ch],0 
00401941  mov         edx,dword ptr [ebp-0Ch] 
00401944  mov         dword ptr [positionX],edx 

и есть следующий код
Код

void * positionX =  ::operator new(4000);

ассемблер
Код

00401914  push        0FA0h 
00401919  call        operator new (40B3F0h) 
0040191E  add         esp,4 
00401921  mov         dword ptr [positionX],eax 


Теперь вопросы откуда разница между вызовом new и ::operator new, разве это не одно и то же?
Я всегда считал, что с помощью new нельзя выделить память под void, а тут такое smile Как тогда это совместить с тем, что new позиционируется как выделятель инициализированной памяти(или я не прав?). И если оператор new возвращает void *, то как это сходится с тем, что new возвращает указатель на требуемый объект, который не требует никаких преобразований?

Заранее спасибо за ответы.


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 23.12.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  23.12.2008,  21:47 Найти цитируемый пост)
Теперь вопросы откуда разница между вызовом new и ::operator new

Оттуда, что в первом случае ты выделяешь память под один объект int и инициализируешь его значением 4000, а во втором - выделяешь 4000 байт.

Цитата(vinter @  23.12.2008,  21:47 Найти цитируемый пост)
разве это не одно и то же?

Это не одно и то же.

Цитата(vinter @  23.12.2008,  21:47 Найти цитируемый пост)
Я всегда считал, что с помощью new нельзя выделить память под void

Так оно и есть.

Цитата(vinter @  23.12.2008,  21:47 Найти цитируемый пост)
Как тогда это совместить с тем, что new позиционируется как выделятель инициализированной памяти(или я не прав?)

Функция operator new не обязана инициализировать память.

Цитата(vinter @  23.12.2008,  21:47 Найти цитируемый пост)
И если оператор new возвращает void *, то как это сходится с тем, что new возвращает указатель на требуемый объект, который не требует никаких преобразований?

Функция operator new возвращает лишь указатель на выделенную память; указатель на объект конкретного типа возвращается new-выражением.
PM MAIL   Вверх
vinter
Дата 23.12.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(UnrealMan @  23.12.2008,  23:24 Найти цитируемый пост)
Это не одно и то же.


Цитата(UnrealMan @  23.12.2008,  23:24 Найти цитируемый пост)
Функция operator new возвращает лишь указатель на выделенную память; указатель на объект конкретного типа возвращается new-выражением.

спасибо, теперь допер smile


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 23.12.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

new(1, 2, 3, 4) T

вернёт результат

Код
operator new(sizeof(T), 1, 2, 3, 4)

преобразованный к T *. Инициализация может быть, а может и не быть - это зависит от нескольких факторов.

Это сообщение отредактировал(а) UnrealMan - 23.12.2008, 22:41
PM MAIL   Вверх
vinter
Дата 24.12.2008, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(UnrealMan @  23.12.2008,  23:39 Найти цитируемый пост)
Инициализация может быть, а может и не быть - это зависит от нескольких факторов.

можешь про это попродробнее? один из факторов это я так понимаю POD\не POD, а еще?


--------------------
Мой блог
PM MAIL WWW   Вверх
UnrealMan
Дата 24.12.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



См. стандарт

Цитата(5.3.4/1)
new-expression:
    ::opt new new-placementopt new-type-id new-initializeropt
    ::opt new new-placementopt ( type-id ) new-initializeropt

new-placement:
    ( expression-list )

new-type-id:
    type-specifier-seq new-declaratoropt

new-declarator:
    ptr-operator new-declaratoropt
    direct-new-declarator

direct-new-declarator:
    [ expression ]
    direct-new-declarator [ constant-expression ]

new-initializer:
   ( expression-listopt )

Цитата(5.3.4/15)
A new-expression that creates an object of type T initializes that object as follows:

— If the new-initializer is omitted:
    — If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized (8.5). If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.
    — Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;
— If the new-initializer is of the form (), the item is value-initialized (8.5);
— If the new-initializer is of the form (expression-list) and T is a class type, the appropriate constructor is called, using expression-list as the arguments (8.5);
— If the new-initializer is of the form (expression-list) and T is an arithmetic, enumeration, pointer, or pointer-to-member type and expression-list comprises exactly one expression, then the object is initialized to the (possibly converted) value of the expression (8.5);
— Otherwise the new-expression is ill-formed.

Можно добавить, что ещё одним фактором является соответствие компилятора стандарту. Например, gcc 3.4.5 не инициализирует массив, создаваемый с помощью new int[5](), хотя по стандарту инициализация должна быть. Насколько я знаю, в новых версиях gcc это исправлено.

Это сообщение отредактировал(а) UnrealMan - 24.12.2008, 15:15
PM MAIL   Вверх
vinter
Дата 24.12.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



еще раз спасибо


--------------------
Мой блог
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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