C++ 内存填充问题
我正在处理一个示例应用程序,在这个应用程序中,我正在序列化一些数据。在客户端应用程序中,我正在读取序列化数据。在这样做的时候,我观察到一些奇怪的行为 在示例应用程序中,对象的大小不同于客户端中数据的大小。我想这是因为内存不足。我的问题是我正试图将“BRUSHOBJ”写入文件。此结构由Microsoft定义。我可以更改此结构的声明。请告诉我如何解决这个问题 请告诉我如何对诽谤的数据类型应用内存填充。您有两个选项C++ 内存填充问题,c++,visual-c++,C++,Visual C++,我正在处理一个示例应用程序,在这个应用程序中,我正在序列化一些数据。在客户端应用程序中,我正在读取序列化数据。在这样做的时候,我观察到一些奇怪的行为 在示例应用程序中,对象的大小不同于客户端中数据的大小。我想这是因为内存不足。我的问题是我正试图将“BRUSHOBJ”写入文件。此结构由Microsoft定义。我可以更改此结构的声明。请告诉我如何解决这个问题 请告诉我如何对诽谤的数据类型应用内存填充。您有两个选项 序列化数据 通过#pragma pack修改内存填充 序列化数据与内存填充无关,您
- 序列化数据
- 通过#pragma pack修改内存填充
typedef struct _BRUSHOBJ {
ULONG iSolidColor;
PVOID pvRbrush;
FLONG flColorType;
} BRUSHOBJ;
请注意,跨进程发送指针是不允许的。序列化指针应该通过写入内存大小和内存本身来完成。无论如何,如果您想将此BRUSHOBJ传递给windows函数,您可以获得未定义的行为。这不是一种支持/记录的在流程中传递BRUSHOBJ的方式
内存填充可以这样应用
#pragma pack(push)
#pragma pack(4)
struct myStruct
{
char Char1
int Int1;
};
#pragma pack(pop)
如果您想修改填充,您应该为自己编写的结构执行此操作。您有两个选项
- 序列化数据
- 通过#pragma pack修改内存填充
typedef struct _BRUSHOBJ {
ULONG iSolidColor;
PVOID pvRbrush;
FLONG flColorType;
} BRUSHOBJ;
请注意,跨进程发送指针是不允许的。序列化指针应该通过写入内存大小和内存本身来完成。无论如何,如果您想将此BRUSHOBJ传递给windows函数,您可以获得未定义的行为。这不是一种支持/记录的在流程中传递BRUSHOBJ的方式
内存填充可以这样应用
#pragma pack(push)
#pragma pack(4)
struct myStruct
{
char Char1
int Int1;
};
#pragma pack(pop)
如果您想修改填充,您应该为自己编写的结构执行此操作。听起来您只是想将
结构的地址强制转换为
char*
,并在其上使用ostream::write
。这根本不起作用。
有填充,但也有不同类型的大小(其中
在不同的平台上变化),字节顺序,以及更多
外来平台(包括大多数大型机)数据表示本身。
通常,您需要指定输出数据的外观
比如,一个字节接一个字节,然后你必须用
所需值
这只适用于简单类型。快速浏览BRUSHOBJ显示
它包含一个指针,您可能需要
跟着你肯定得做点什么,因为
接收端将无法使用指针执行任何操作
数据。(根据描述,我怀疑你必须转换它
转换为某种标识符,并传输字典映射
这样的标识符是对象的。但我不知道这是怎么回事
结构是用来确定的。)听起来你只是想把结构的地址强制转换为
char*
,并在其上使用ostream::write
。这根本不起作用。
有填充,但也有不同类型的大小(其中
在不同的平台上变化),字节顺序,以及更多
外来平台(包括大多数大型机)数据表示本身。
通常,您需要指定输出数据的外观
比如,一个字节接一个字节,然后你必须用
所需值
这只适用于简单类型。快速浏览BRUSHOBJ显示
它包含一个指针,您可能需要
跟着你肯定得做点什么,因为
接收端将无法使用指针执行任何操作
数据。(根据描述,我怀疑你必须转换它
转换为某种标识符,并传输字典映射
这样的标识符是对象的。但我不知道这是怎么回事
结构是用来确保的。)