使用非托管代码直接修改字符串

原创 2005年05月26日 23:17:00

  在string方法中,如ToUpper等字符串操作方法,都会产生一个新的字符串,这样增大了运行开支。一个替代方案是通过非托管代码直接操作字符串。如替代ToUpper方法:
using System;

public class Test
{
 public static void Main(string[] args)
 {
  string str = "hello";
  ToUpper(str);
  Console.WriteLine(str);
 }
 private static unsafe void ToUpper(string str)
 {
  fixed(char * pfixed = str)
  for(char * p=pfixed;*p!=0;p++)
  {
   *p = char.ToUpper(*p);
  }
 }
}

fixed语句:
格式 fixed ( type* ptr = expr ) statement
它的目的是防止变量被垃圾回收器生定位。
其中:
type为非托管类型或void
ptr为指针名
expr为可以隐式转换为type*的表达式
statement为可执行的语句或块
  fixed语句只能在unsafe的上下文中使用,fixed 语句设置指向托管变量的指针并在 statement 执行期间“锁定”该变量。如果没有 fixed 语句,则指向托管变量的指针将作用很小,因为垃圾回收可能不可预知地重定位变量。
  执行完 statement 后,任何锁定的变量都被取消锁定并受垃圾回收的制约。因此,不要指向 fixed 语句之外的那些变量。在不安全模式中,可以在堆栈上分配内存。堆栈不受垃圾回收的制约,因此不需要被锁定。

但在编译时,因为使用了非托管代码,必须要使用/unsafe才能通过。

托管与非托管代码的区别

Unity 性能优化 系列(二)DrawCall
  • bioman1224
  • bioman1224
  • 2016年08月30日 00:04
  • 549

C#调用非托管代码(转)

C#调用非托管代码(转) 在.net 编程环境中,系统的资源分为托管资源和非托管资源。   对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的 只是了解...
  • u010473136
  • u010473136
  • 2016年12月03日 21:13
  • 598

关于C#托管代码与非托管代码的理解

C#托管代码是什么? 托管代码(Managed Code)实际上就是中间语言(IL)代码。代码编写完毕后进行编译,此时编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。程序...
  • u010272085
  • u010272085
  • 2016年02月20日 09:27
  • 2861

C#如何直接调用非托管代码

 C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数。 2.  调用 COM 对象上的接口方法 我主要讨论从dll中导出函数,基本步骤如...
  • yulongguiziyao
  • yulongguiziyao
  • 2013年11月27日 20:40
  • 1060

Windbg教程-调试非托管程序的基本命令中

前面的文章调试非托管程序的基本命令上讲到如何在windbg里面启动一个程序并且加载调试符号文件。一旦符号文件加载完毕以后,就可以进行调试了,例如设置断点,查看堆栈信息等等。   因为是刚刚...
  • liujiayu2
  • liujiayu2
  • 2016年06月29日 10:52
  • 381

在C#中调用托管和非托管代码的问题

  C#中使用非托管指针* 值针可以在带有unsafe的函数中正常使用。必须在函数前,static关键字后加入unsafe关键字。如static unsafe void Main(string[] a...
  • polinzhuo
  • polinzhuo
  • 2007年03月12日 09:50
  • 1743

如何简单修改Android的so文件 - 限于修改字符串常量

http://blog.csdn.net/yihongyuelan/article/details/8992283 场景 有的时候需要定制Android默认蓝牙设备名称,当...
  • thinkinwm
  • thinkinwm
  • 2013年10月08日 17:39
  • 3346

缓冲区溢出还是问题吗?C++/CLI安全编码

from:http://dotnet.chinaitlab.com/VCNET/712748.html        C++/CLI是对C++的一个扩展,其对所有类型,包括标准C++类,都添加了对属性...
  • nomad2
  • nomad2
  • 2007年05月16日 16:47
  • 703

【js学习笔记-013】--字符串直接量

"" //空字符串 包含0个字符 'testing' "3.14" 'name="myform"' ECMAScript 3中字符串直接量必须写在一行中,而在ECMAScript 5中,字符串直接量可...
  • pigpigpig4587
  • pigpigpig4587
  • 2013年07月19日 08:49
  • 716

二进制文件中的字符串替换

如果使用C++写一段内存的替换,只使用简单的比较或是memcpy等操作,来实现替换一个文件中的内容,写起来还是有点麻烦的: 首先要把文件内容读取到字符串中,然后从文件的开头字符进行比较,直到匹配上字符...
  • chunyexiyu
  • chunyexiyu
  • 2016年07月28日 22:38
  • 779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用非托管代码直接修改字符串
举报原因:
原因补充:

(最多只允许输入30个字)