none
如何关闭数组边界检查?(不使用不安全代码) RRS feed

  • 问题

  • 为了提高性能,想关闭数组边界检查,但在visual studio的编译器优化选项中没找到相应的优化选项。

    我也不愿意用不安全代码,有没有通过设置编译器的方式来实现关闭数组边界检查的方法?

    2010年10月27日 2:14

答案

  • 你好!

        这个检查是CLR做的,不是C#编译器的行为。你应该能注意到,当所以越界的时候,是抛出IndexOutOfRangeException异常,而不是报告编译错误的。这说明这个检查是CLR来做的。

        你只能通过非安全的代码来阻止CLR做这个检查。

        另外,JIT编译器会对代码进行优化,所以这个检查的性能开销很小,如果一定要避免,目前只能通过非安全代码来实现。


    周雪峰
    • 已标记为答案 062369 2010年10月27日 8:11
    2010年10月27日 7:45
    版主

全部回复

  • visual studio 会检查数组越界? 数组越界要在运行时才发生的吧?

    如果编译器都能看得出的数组越界,个人觉得是个错到不能再错的问题了


    学习学习....
    2010年10月27日 3:22
  • 我的意思就是在运行时不要检查边界,这才能提高程序性能嘛。

    2010年10月27日 3:36
  • 本来就是没有检查。。。只是指针指向它不能读写的区域会出错而已。
    学习学习....
    2010年10月27日 4:48
  • 运行时访问数组元素应该是默认有检查的,要不然怎么知道访问是否越界呢?反正我看的资料是这么说的。但是这样做会影响性能呀,所有我才要关闭它,我自己能保证不越界访问。
    2010年10月27日 7:12
  • 运行时的数组越界是确实有边界检查的,不过很可惜,您不能修改这一 CLR 行为。因为数组越界检查是一个基本的,维护类型安全的措施,就像 String 一样,必须利用多出的 4 个字节存放弃长度。

    数据的开始 4 个字节是该数组的长度,当访问数组中的元素时,CLR 保证下标不会超出预定范围,否则,IndexOutOfRangeException 就会引发。而且,如果可以关闭该检查,那么就再也无从得知访问下标是否越界。特殊的,C# 允许定义下标不为 0 的数组,如果能关闭越界检查,那对于下标不为 0 的数组又该如何呢?

    所以,C# 不像其他非托管语言,它重视类型安全,并不可能提供关闭数组越界检查的选项。

    另外,整数溢出的越界检查可以被关闭。


    Mark Zhou
    2010年10月27日 7:39
  • 你好!

        这个检查是CLR做的,不是C#编译器的行为。你应该能注意到,当所以越界的时候,是抛出IndexOutOfRangeException异常,而不是报告编译错误的。这说明这个检查是CLR来做的。

        你只能通过非安全的代码来阻止CLR做这个检查。

        另外,JIT编译器会对代码进行优化,所以这个检查的性能开销很小,如果一定要避免,目前只能通过非安全代码来实现。


    周雪峰
    • 已标记为答案 062369 2010年10月27日 8:11
    2010年10月27日 7:45
    版主