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));
转换时可能导致混乱。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原因: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));
转换时可能导致混乱。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- C++ 静态变量的初始化 以及 vector的初始化
- c++内存安全问题
- 【C++模版之旅】神奇的Traits
- 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
- 黑马程序员——C语言基础05—函数
- C++ 编码规范
- mfc下关于f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\occcont.cpp(926) 的奇怪问题
- 用google mock模拟C++对象
- 为什么C++中声明和定义要分开写
- c++11单实例(singleton)初始化的几种方法(memory fence,atomic,call_once)
- C++17 最新进展
- 解决类似/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found错误
- C语言单向链表
- 黑马程序员——C语言基础04—程序控制
- C++面向对象操作符重载:调用操作符和函数对象
- c#和c++互操作(平台调用相关)
- C++实现调用C#(CLI)方法
- struct 区别 在C 和C++ 中
- C C++ 文件输入与输出
- C++primer--泛型算法初识