0

我想知道是否有办法在实例化后填充对象。说一个从类 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 from Foo* object = new Foo()(size_t)differentObj from Foo* differentObj = AddObject() 进行比较,(size_t)differentObj 则将(size_t)buffer(size_t)object. 也许是因为我不明白代表的内容与内存中对象的位数是否size_t不同,我不确定。sizeof至少据我了解sizeof,它代表变量或类型占用的内存量(以字节为单位)。

4

2 回答 2

1

您是否意识到这(size_t)object并没有给您任何大小,而是将对象转换为类型size_t(通常定义为 unsigned int)的(c 样式)?参见例如这个size_t 文档sizeof(请参见此处的文档)返回一个 type 的值size_t,这可能就是您对它的困惑的来源?

你可能想一直使用sizeof。不过,要小心你传入的内容sizeofsizeof(Foo*)例如会给你一个指针Foo的大小,而不是Foo对象的大小。对于后者,您必须使用sizeof(Foo).

(sizeof)x在编译时进行评估,并通过类型定义计算;在x用户定义类型的情况下,即通过结构或类接口。所以没有办法改变结果sizeof,除了改变界面。

于 2013-09-11T08:04:12.970 回答
0

如果你想在特定地址构造一个对象,你应该使用placement new:

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

请注意,如果您使用此版本的new.

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

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

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

无论如何,您应该只在真正需要时才使用这些技术,因为指针摆弄会使代码复杂化很多。

于 2013-09-11T08:39:17.053 回答