C++ sizeof(struct) 的注意

今天在测试将C++代码导出的NavMesh二进制文件用一套C#改写的代码导入时,发现导入的数据出现不一致的问题.

分别在C++和C#AddTile的函数内设置断点,观察最后得到的tile有大部分的字段是导入一致的.但是有些字段则出现的一些偏移.

于是猜测应该为C#导入某个结构时出现了位偏移差错,追踪并对比每个字段的导入结果和偏移.最终发现这个结构导入时,出现了偏移变量相差2个单位

在C++处,导入该结构前偏移变量 = 276, 然后导入时: = 276 + sizeof(dtPolyDetail) = 288.

在C#处,导入该结构前偏移变量 = 276, 导入时: = 276 + sizeof(uint) + sizeof(uint) + sizeof(byte) + sizeof(byte) = 286.

struct dtPolyDetail
{
unsigned int vertBase;
unsigned int triBase;
unsigned char vertCount;
unsigned char triCount;
};

我们知道 sizeof(uint) = 4; sizeof(uchar) = sizeof(byte) = 1 但是sizeof(dtPolyDetail) != sizeof(uint) * 2 + sizeof(uchar) * 2

原因就是VC自动填充的对齐用到空字节:

参考

http://www.cnblogs.com/lazycoding/archive/2011/03/22/sizeof-struct.html

时间: 2024-08-23 08:31:29

C++ sizeof(struct) 的注意的相关文章

自然对齐:sizeof struct, union

[1]以下关于 JVM 的叙述,哪些项正确? A.JVM 运行于操作系统之上,它依赖于操作系统 B.JVM 运行于操作系统之上,它与操作系统无关 C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件 D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件 扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件 扩展名为.class的是字节码文件(二进制):系统运行时执行的文件 [2]下列选项中正确的表达式是: A.byte b = 128; 

sizeof(struct)

#include<stdio.h> #include<iostream> #include<assert.h> using namespace std; struct s1 { char a; char b; char c; }; struct s2 { int a; char b; short c; }; struct s3 { char a; int b; short c; }; int main() { cout<<sizeof(s1)<<

【基础备忘】求sizeof struct

转自牛客网 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的地址是0x0000,那么b的地址将会是0x0002或者是0x0004. 那么就出现这样一个问题:0x0001这个地址没有被使用,那它干什么去了? 答案就是它确实没被使用. 因为CPU每次都是从以2字节(16位CPU)或是4字节(32位CPU)的整数倍的内存地址中读进数据的.如果变量b的地址是0x0001的话,

c语言结构体大小 sizeof(struct A)

1,数据类型自身对齐 数据类型的起始地址为其大小的整数倍 2,结构体的自身对齐 结构体的自身对齐值为其中最大的成员大小 3,指定对齐 可以使用关键词#pragma pack(1) 来指定结构体的对齐值 4,有效对齐值 有效对齐值为自身对齐值与指定对齐值中较小的一个.(即指定对齐值超过自身对齐值无意义) 1 #include<stdio.h> 2 struct { 3 int a; //单个为4 4 char b[3]; // 单个大小为1 因为是数组总和为3 5 double c; //单个为

[C++] sizeof(struct)

关于对结构体求sizeof.需要考虑一下几点: 1.内存对齐 2.机器的位数(32 or 64) 3.是否含有虚函数 4.继承关系 5.static不归入sizeof 6.普通成员函数与sizeof无关 以32位系统为例 Exp 1 空类:占用1个字节. class Base {}; class Base { public: Base(); ~Base(); };sizeof(Base) = 1 Exp 2 虚函数:占用4个字节 class Base { public: Base(); virt

【ThinkingInC++】25、用sizeof运算符可以确定struct的长度。

/** * 功能:用sizeof运算符可以确定struct的长度. * 时间:2014年8月18日08:10:14 * 作者:cutter_point */ #include"CLib.h" #include"CppLib.h" #include<iostream> using namespace std; struct A { int i[100]; }; struct B { void f(); }; void B::f(){} int main()

关于sizeof的那些事

一 结构体 先上代码: struct A { int a; double d; char b; short c; }; 以上代码的sizeof(struct A)为24.分析: a占用4字节,由于d占用8字节,且d需要在8字节处对齐,因此a不仅有4字节存放内容,并且占另外的4个字节使得d位于8字节处.由于c需要在2字节处对齐,所以b占用了2个字节,c占用两个字节,目前总共是20字节,但是整个结构体A根据最大字节对齐,因此为8字节对齐,为了使得类型位struct A的数组的下一个元素处于正确的对齐

(C)struct结构体指针

结构体指针 指针结构与指针的关系亦有两重:其一是在定义结构时,将指针作为结构中的一个成员:其二是指向结构的指针(称为结构指针). 前者同一般的结构成员一样可直接进行访问,后者是本节讨论的重点. 结构指针说明的一般形式是: struct (结构类型名称) * (结构指针变量名);例如:struct date * pdate, today;说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量. 语句: struct date{ int year; int mo

漫谈C语言结构体struct、公用体union空间占用

先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; union union_data1{ short a;//本身占用2个字节 char b[13];//本身占用13个字节 int c ;//本身占用4个字节 }; struct struct_data{ int a ;//int本身占用4个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为