2017-02-05 16 views
0

Везде я иду за учебники, я вижу, что вы должны установить мир в Box2D, как это:Почему я должен использовать новый оператор при инициализации b2World? - Box2D

b2World* world; 
world = new b2World(b2Vec2(0.0f, -9)); 

и почему они не просто делают это:

b2World world; 
world = b2World(b2Vec2(0.0f, -9)); 

Я имею в виду, Я не вижу преимуществ этого - так может кто-то попытаться объяснить это? Благодаря! Ваше время очень ценится :)

+1

Вы не можете сделать второй, потому что 'b2World' [не имеет конструктора по умолчанию] (http://www.learn-cocos2d.com/api-ref/1.0/Box2D/html/classb2_world.html). Вероятно, вы можете сделать «b2World world» ({0.0f, -9}); вместо этого было бы более эффективно и сложнее получить управление памятью неправильно, но точка Box2D - сделать реалистичные физические симуляции, а не писать симпатичный код , – nwp

+0

Спасибо! Я думаю, что получаю то, что вы говорите, но почему разработчики Box2d основывают каждый на указателях на мире, а не только на b2world без указателя? –

+1

@SUhost Если, к сожалению, это не значит, что срок жизни объекта должен пережить область действия декларации, это скорее является реакцией на коленец, чтобы использовать «новый» всякий раз, когда создаваемый объект является сложным по своей природе. Другие причины могут заключаться в том, что авторы примерного кода являются Java или программистами на C#, а 'new' для создания объектов - привычка. – PaulMcKenzie

ответ

0

Вам не нужно использовать новый оператор. Как вы отметили, вы можете создать его экземпляр в стеке, как:

b2World world(b2Vec2(0, 10)); 

Принимали вы посмотрите на то, как велики b2World экземпляров, хотя?

Try что-то вроде:

std::cout << sizeof(b2World) << std::endl; 

Я получаю размер 103,296 байт!

Для многих систем, помещая 103 296 байт в стек, не проблема. Однако это не относится ко всем системам. И бежать из пространства стека не всегда очень очевидная ситуация.

В любом случае, я считаю, размер b2World быть удивительно большой (и в моей вилке Box2D я переработал мирового класса намного меньше). Таким образом, этот вопрос сводится к более общему вопросу о том, поставить ли экземпляр мира в стек или положить его в кучу.

я нашел следующий вопрос и ответы, которые я считаю, может дать дополнительные указания: When is it best to use the stack instead of the heap and vice versa? Второй набравших наибольшее количество голосов ответ был:

Как правило, избежать создания огромных объектов на стеке.

Пока я не знаю наверняка, что размер b2World экземпляров поэтому примеры использования новых (даже тогда, когда они могли бы использовать стек), я подозреваю, что это было много с ним делать.