C++与C#的内存映射

这几天试验了一下内存映射的效率,主要参考了网上的几篇资料

C# : http://blog.csdn.net/linux7985/article/details/5853358

C++:http://blog.csdn.net/believefym/article/details/1162461

 

根据第一篇文章的代码,封装了一个类ShareMemory,C#和C++各一份,方便进行内存映射

很奇怪的是C#的运行速度要比C++快很多!


在封装类的时候:

C# 中的Marshal.Copy( m_pwData, bytData, lngAddr, lngSize ); 内存拷贝这个功能,

对应C++中用的是memcpy。

C++耗时间的操作主要在memcpy,将映射得到的内存拷贝到一个new出来的BYTE动态数组中

好像memcpy 拷贝 堆分配的内存 的速度比Marshal.Copy要慢一些?

试图不用memcpy,直接sscanf读映射出来的内存,又报错,郁闷了。看来必须要memcpy


最后还是放弃了用C++,采用了C#。


据说.net 4.0新增加了内存映射的功能,以后有空试一试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 共享内存是一种进程间通信方式,它使得在内存中创建一段可以被多个进程共享并访问的内存空间。这可以提高进程间的通信效率,因为在共享内存中的数据不需要使用复杂的消息传递机制来传递。 在C语言中,通过使用共享内存,可以非常方便地在不同的进程之间共享数据,而避免使用其他进程间通信方式(如管道、消息队列等)。要使用共享内存,在C语言中可以使用system V或POSIX标准的共享内存函数库,如shmget、shmctl等函数来进行共享内存的创建和管理。例如,可以使用shmget函数来创建共享内存区域,然后使用shmat函数将其映射到进程的地址空间中,实现对共享内存的访问。 需要注意的是,在使用共享内存时,需要保证进程之间对共享内存的读写操作的互斥性,以避免数据的不一致性和冲突。因此,在使用共享内存时,通常需要使用信号量、互斥锁等机制来对共享内存进行同步和保护。 总的来说,共享内存在C语言中的应用广泛,可以用来实现进程之间高效、快速的数据共享,同时也需要一定的技术和经验来有效地使用和管理。 ### 回答2: 共享内存是一种进程间通信的方式,它可以让多个进程之间快速、高效地共享数据。在共享内存中,几个进程可以通过一个共享的内存区域来访问同一组数据。这种方式通常比其他的进程间通信方式,比如管道、消息队列等更快速、更高效。 在C语言中,我们可以使用系统提供的共享内存函数来创建、读取、写入、删除共享内存。在创建共享内存时,我们需要指定共享内存的大小,并且需要给共享内存分配一个标识符,这个标识符可以让多个进程之间访问同一个共享内存。 在读写共享内存时,我们需要先将共享内存映射到当前进程的空间中,然后就可以通过指针访问共享内存中的数据了。在访问完共享内存后,我们需要将共享内存从当前进程的空间中解除映射,以免出现内存泄漏等问题。 总之,共享内存是一种非常有用的进程间通信方式,它可以帮助多个进程高效地共享数据。因此,我们在编写多进程程序时,可以尝试使用共享内存来提高程序的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值