我想知道实例化后是否有填充对象的方法。用下面的实现说一个从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) object中的Foo* object = new Foo()(size_t)differentObj中的Foo* differentObj = AddObject()进行比较,则(size_t)differentObj将与,但与(size_t)buffer不同。也许是因为我不确定(size_t)objectsize_t所代表的含义不同,我不确定该对象在内存中的位数。至少根据我的理解,sizeof表示变量或类型占用的内存量(以字节为单位)。

最佳答案

如果要在特定地址构造对象,则应使用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。)

无论如何,只有在确实需要时才应使用这些技术,因为指针摆弄使代码非常复杂。

10-05 20:46
查看更多