Мне было интересно, был ли способ поместить объект после создания экземпляра. Скажем, объект экземпляра от класса Foo с ниже реализации:Как правильно разместить объект после создания без изменения объявления класса?
class Foo
{
size_t addr;
unsigned allocationNum;
public:
Foo()
{
addr = (size_t)this;
allocationNum = 0;
}
~Foo()
{
addr = 0;
allocationNum = 0;
}
void SetAllocNum(unsigned nAllocationNum)
{
allocationNum = nAllocationNum;
}
unsigned GetAllocNum() const
{
return allocationNum;
}
size_t GetAddress() const
{
return addr;
}
};
экземпляр объекта, то создается через Foo* object = new Foo();
. Есть ли способ сказать, добавить объект, чтобы (size_t)object
или sizeof(*object)
показал это как более крупный объект? Также, когда вы говорите, что для этого объекта используется стандартный тип данных, например char *, есть способ сделать это, чтобы заставить char * соответствовать размеру объекта, на который он набрасывается? Я задаю эти вопросы несколько из любопытства и потому, что я чувствую, что это может решить проблему, которая у меня есть с моей программой. Вот конкретный контекст:
T* AddObject()
{
T* object = new T(); // Here is the new object T=Foo in this case.
*(T*)(buffer+position) = *object; // Being stored in a char* buffer at current empty position
T* returnValue = &(*(reinterpret_cast<T*>(buffer+position)));
//^Here I try casting the char* [email protected] with the object contents stored inside the buffer.
return returnValue;
}
Проблема с этим состоит в том, что он бросает его на объект T несколько прилично, но размер по-прежнему, что из буфера. Выполнение sizeof(*object)
в основном будет показывать то, что я думаю, что размер объекта должен быть, но если сравнить с (size_t) object
из Foo* object = new Foo()
с (size_t)differentObj
от Foo* differentObj = AddObject()
(size_t)differentObj
будут таким же, как (size_t)buffer
, но не таким же, как (size_t)object
. Может быть, потому, что я не понимаю, что size_t
представляет иначе, чем sizeof
, независимо от того, имеет ли количество бит объекты в памяти или нет. Я не уверен. По крайней мере, из того, что я понимаю, sizeof
представляет объем памяти в байтах, который занимает переменная или тип.
Является ли это вашей идеей о том, как сериализовать объекты в/из буферов памяти и, в конечном итоге, (потенциально) через/другие среды? Я спрашиваю, потому что (а) есть * много * лучших способов и (б) Если вы заинтересованы в создании объекта в буфере самоконтролируемой памяти, я предлагаю вам изучить [место-новую идиому] (http://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new). Несмотря на это, объекты определяются по типу с определенным статическим размером. Вы не можете изменить это определение во время выполнения. Но вы можете содержать членов, которые используют управление кучей для роста (например: вектор). – WhozCraig
@WhozCraig хорошо Я попытался сделать сериализацию через Boost, но проблема с boost была необходимостью управления объявлением объекта, чтобы дать доступ для повышения сериализации. Атм. Я не могу коснуться, где объявлена / определена декларация объекта, поэтому мне пришлось придумать это обходное решение. Плюс я предпочитаю использовать векторы для реализации контейнеров, но мне было запрещено делать это в этой программе. Спасибо, потому что вы и другие предложения помогли мне указать на правильное направление. Также я не мог избежать отправки указателя объекта, поэтому сериализация не помогла бы мне в этом случае? – hellfiremarine