我创建了一个带有Id变量和值列表的结构。当我在将函数作为void *传递给函数之前检查大小时,它是12.一旦它进入函数,它就是4.如何保持大小相同?
结构代码:
typedef struct
{
int id;
std::list<int> sensorValues;
}dataPacketDef;
发送到其他功能代码:
void SendDataBufferToServer()
{
cout << "Sending network data size: " << sizeof(dpd) << "\n";
client.writeData((void*)&dpd);
}
在上面的函数中,大小为12,但在接收函数中,大小只有4.结构被声明为主程序的全局变量。
答案 0 :(得分:3)
在将它作为void *传递给函数之前它是12.一旦它进入函数它就是4
因为在程序的情况下sizeof指针是4个字节,如果将结构的实例转换为void *,则无法读取sizeof结构。您可以通过传递给您的函数的结构大小即foo(static_cast<void*>(&myStructObj), sizeof(TypeOfMyStruct))
来修复它。
[编辑]
同样在Orbit中的Lightness Races在他的回答中指出,序列化std :: list是错误的,你只会写指向你的文件/
答案 1 :(得分:3)
在该功能中,您的尺寸为void*
,而不是dataPacketDef
。而且,显然,您的系统sizeof(void*)
是4个字节。 sizeof
运算符只是类型驱动的:它不会对pointees进行神奇的检查。事实上,既然你已经使用过时的演员表进行了类型擦除,那么它就不能。
您无法以这种方式序列化您的对象。该清单不是平面数据;它的元素实际上不是dataPacketDef
的一部分,而是动态分配的。该列表包含指向这些元素的指针。您所做的只是序列化指针,这些指针在目标系统上立即变得毫无意义。
完全放弃这种方法,研究如何在现代C ++中正确地序列化对象。
答案 2 :(得分:2)
指针的大小为4个字节(如果使用的是x64编译器,则为8个字节)。如果template<typename T>
void writeData(Client& client, const T& obj)
{
client.writeData((void*)&obj, sizeof(obj));
}
需要知道指向对象的大小,则需要以某种方式将该信息传递给它;一个常见的习惯用法是将大小作为第二个参数传递。完成后,您可以使用辅助函数模板来简化操作:
client.writeData()
虽然正如molbdnilo在问题评论中指出的那样,list
可能仍然无法通过dataPacketDef
class="profile"
中的class="employeeul"
来实现您想要的效果
答案 3 :(得分:0)
这是正确的。
指针始终包含一个地址,即机器上的4个字节。
因此,任何指针的大小在32位寻址架构上都是4个字节。
答案 4 :(得分:0)
sizeof(void *)在32位机器上是4个字节。