我想知道是否有办法在实例化后填充对象。假设一个对象从类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
的{{1}}进行比较{ {1}}与Foo* differentObj = AddObject()
相同,但与(size_t)differentObj
不同。也许是因为我不明白(size_t)buffer
代表什么不同于(size_t)object
它是否是内存中对象的位数,我不确定。至少根据我的理解size_t
表示变量或类型占用的内存量(以字节为单位)。
答案 0 :(得分:1)
你是否意识到(size_t)object
没有给你任何大小,但这是一个(c风格)对象转换为类型size_t
(通常定义为unsigned int)?参见例如这size_t documentation。 sizeof
(请参阅例如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_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
。)
无论如何,如果你真的需要,你应该只使用这些技术,因为指针摆弄会使代码复杂化。