C++ 内存填充问题

C++ 内存填充问题,c++,visual-c++,C++,Visual C++,我正在处理一个示例应用程序,在这个应用程序中,我正在序列化一些数据。在客户端应用程序中,我正在读取序列化数据。在这样做的时候,我观察到一些奇怪的行为 在示例应用程序中,对象的大小不同于客户端中数据的大小。我想这是因为内存不足。我的问题是我正试图将“BRUSHOBJ”写入文件。此结构由Microsoft定义。我可以更改此结构的声明。请告诉我如何解决这个问题 请告诉我如何对诽谤的数据类型应用内存填充。您有两个选项 序列化数据 通过#pragma pack修改内存填充 序列化数据与内存填充无关,您

我正在处理一个示例应用程序,在这个应用程序中,我正在序列化一些数据。在客户端应用程序中,我正在读取序列化数据。在这样做的时候,我观察到一些奇怪的行为

在示例应用程序中,对象的大小不同于客户端中数据的大小。我想这是因为内存不足。我的问题是我正试图将“BRUSHOBJ”写入文件。此结构由Microsoft定义。我可以更改此结构的声明。请告诉我如何解决这个问题

请告诉我如何对诽谤的数据类型应用内存填充。

您有两个选项

  • 序列化数据
  • 通过#pragma pack修改内存填充
序列化数据与内存填充无关,您只是定义了一种向内存位置(内存流)写入/读取内存的方法

我看到这个BRUSHOBJ结构有如下定义

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修改内存填充
序列化数据与内存填充无关,您只是定义了一种向内存位置(内存流)写入/读取内存的方法

我看到这个BRUSHOBJ结构有如下定义

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显示 它包含一个指针,您可能需要 跟着你肯定得做点什么,因为 接收端将无法使用指针执行任何操作 数据。(根据描述,我怀疑你必须转换它 转换为某种标识符,并传输字典映射 这样的标识符是对象的。但我不知道这是怎么回事 结构是用来确保的。)