我想知道实例化后是否有填充对象的方法。用下面的实现说一个从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* 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)object
与size_t
所代表的含义不同,我不确定该对象在内存中的位数。至少根据我的理解,sizeof
表示变量或类型占用的内存量(以字节为单位)。 最佳答案
如果要在特定地址构造对象,则应使用new放置:
T* AddObject()
{
return new (buffer+position) T();
}
请注意,如果使用此版本的
new
,则不能使用默认删除。sizeof
是一个编译时运算符,它将根据类型产生其值。它不能重载,并且返回值的类型为size_t
。 size_t
是标准库中定义的无符号整数类型。编写
(size_t)differentObj
时,是从T*
转换为size_t
。这是有效的,但通常不是人们想要做的。如果要计算两个指针之间以精确字节为单位的偏移量,请说reinterpret_cast<char*>(pointer1) - reinterpret_cast<char*>(pointer2)
。当两个指针具有相同的值(例如
(size_t)differentObj == (size_t)buffer
)时,表示它们指向同一对象。 (这意味着在您的示例中,必须将position
设置为0
。)无论如何,只有在确实需要时才应使用这些技术,因为指针摆弄使代码非常复杂。