您的位置:首页 > 编程语言 > C语言/C++

C# 调用C++DLL传递的bool型,返回混乱

2015-11-11 10:57 471 查看
问题:C# 调用C++DLL传递的bool型,返回混乱

原因:C++中bool占一个字节,C#中bool占4个字节

解决方法:将C++中的bool该为BOOL,或C#中的bool该为byte

原因:统一变量所占地址空间大小。C++中BOOL与C#中bool同样占用4个字节,C#中byte与C++中bool同样占用一个字节。

C++中定义如下结构体

struct MYSTRUCT

{

int a;

int b;

float c;

bool d;

}

sizeof(MYSTRUCT) == 16;

sizeof(int)*2+sizeof(float)+sizeof(bool) ==13;

二者不相等:编译器会对结构体进行处理时,会进行字节对齐,以加快计算机取数速度。

字节对齐:max(max(sizeof(int),sizeof(float)),sizeof(bool)) == 4;sizeof(MYSTRUCT)应为4的整数倍取16;即:(13+(4-1))/4*4 ==16

若该为如下

struct MYSTRUCT

{

int a;

int b;

float c;

bool d;

bool e;

}

sizeof(int)*2+sizeof(float)+sizeof(bool)*2 ==14;

sizeof(MYSTRUCT) == 16;即(14+(4-1))/4*4 == 16

同样若是如下结构体

struct MYSTRUCT

{

double a;

int b;

bool e;

}

max(max(sizeof(double),sizeof(int)),sizeof(bool)) == 8;

sizeof(double)+sizeof(int)+sizeof(bool) == 13;

sizeof(MYSTRUCT) == (13+(8-1))/8*8 == 16;

C#中定义如下结构

struct MYSTRUCT

{

public int a;

public int b;

public float c;

public bool d;

}

Marshal.SizeOf(typeof(MYSTRUCT)) == 16;

与C++相同,但bool所占字节不同,

(MYSTRUCT)Marshal.PtrToStructure((IntPtr)((UInt32)ptrRsult), typeof(MYSTRUCT));

转换时可能导致混乱。

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: