如何在创建后正确填充对象而不修改类声明?

时间:2013-09-11 07:51:12

标签: c++ oop casting buffer

我想知道是否有办法在实例化后填充对象。假设一个对象从类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)objectsizeof(*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* buffer@position with the object contents stored inside the buffer.
   return returnValue;
}

问题在于它将它投射到T对象有点体面但是大小仍然是缓冲区的大小。在main中执行sizeof(*object)将显示我认为该对象的大小应该是什么,但是我是否将(size_t) objectFoo* object = new Foo()与来自(size_t)differentObj的{​​{1}}进行比较{ {1}}与Foo* differentObj = AddObject()相同,但与(size_t)differentObj不同。也许是因为我不明白(size_t)buffer代表什么不同于(size_t)object它是否是内存中对象的位数,我不确定。至少根据我的理解size_t表示变量或类型占用的内存量(以字节为单位)。

2 个答案:

答案 0 :(得分:1)

你是否意识到(size_t)object没有给你任何大小,但这是一个(c风格)对象转换为类型size_t(通常定义为unsigned int)?参见例如这size_t documentationsizeof(请参阅例如its documentation here)会返回size_t类型的值,可能是您对它的混淆来自哪里?

您可能希望始终使用sizeof。但是要注意你传递给sizeof的内容。例如,sizeof(Foo*)将为您指定Foo指针的大小,而不是Foo对象的大小。对于后者,您必须使用sizeof(Foo)

(sizeof)x在编译时进行评估,并通过类型定义计算;在x是用户定义类型的情况下,即由struct或class接口。因此,除了更改界面之外,无法更改sizeof的结果。

答案 1 :(得分:0)

如果要在特定地址构建对象,则应使用placement new:

T* AddObject()
{
    return new (buffer+position) T();
}

请注意,如果您使用此版本的new,则无法使用默认删除。

sizeof是一个编译时运算符,它将从类型中获取其值。它不能重载,返回值的类型为size_tsize_t是标准库中定义的无符号整数类型。

撰写(size_t)differentObj时,您从T*投射到size_t。这是有效的,但通常不是人们想做的事情。如果要以精确字节计算两个指针之间的偏移量,请说reinterpret_cast<char*>(pointer1) - reinterpret_cast<char*>(pointer2)

当两个指针具有相同的值(例如(size_t)differentObj == (size_t)buffer)时,意味着它们指向同一个对象。 (这意味着您的示例中position必须设置为0。)

无论如何,如果你真的需要,你应该只使用这些技术,因为指针摆弄会使代码复杂化。