// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
ThrowHelper.ThrowArgumentOutOfRangeException();
}
Run Code Online (Sandbox Code Playgroud)
显然这比(?)更有效 if (index < 0 || index >= _size)
我很好奇这个技巧背后的理由.单个分支指令真的比两个转换要贵uint
吗?或者是否还有一些其他优化会使这个代码比另外的数字比较更快?
为了解决房间里的大象:是的,这是微优化,不,我不打算在我的代码中到处使用它 - 我只是好奇;)
c# performance micro-optimization numeric-conversion range-checking
所以我只是遇到了一些奇怪的Python特性,并想要对它进行一些澄清.
以下数组操作有点有意义:
p = [1,2,3]
p[3:] = [4]
p = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
我想它实际上只是将这个值附加到最后,对吗?
但是,我为什么要这样做呢?
p[20:22] = [5,6]
p = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
更是如此:
p[20:100] = [7,8]
p = [1,2,3,4,5,6,7,8]
Run Code Online (Sandbox Code Playgroud)
这似乎是错误的逻辑.这似乎应该抛出错误!
任何解释?
- 这只是Python的奇怪之处吗?
- 有目的吗?
- 我是否以错误的方式思考这个问题?
考虑:
{$R+}
i:= 1;
While i > 0 do
i:= i + 1;
ShowMessage(IntToStr(i));
Run Code Online (Sandbox Code Playgroud)
如果我声明i
为Byte,Word,Shortint或TinyInt,我会得到范围检查错误,如预期的那样.如果我声明i
为LongWord,Cardinal,Integer,LongInt或Int64,它只是通过while循环并显示负值或0值,i
当你通过上限时得到.
Delphi 7不支持32位和64位数字的范围检查吗?
如何关闭文件的一部分范围检查.关闭很简单,但如何在以后恢复到项目设置?下面的伪代码应该解释它:
Unit1;
//here's range checking on or off as per the project setting
code here...
{$R-}
//range checking is off here because the code causes range check errors
code here...
//now I want to revert to the project setting. How do I do that?
code here...
end.
Run Code Online (Sandbox Code Playgroud) 我有一个程序,它指定一个超出它界限的数组,我期待抛出运行时错误.然而,根本没有出现错误,程序继续写入未声明的内存.是否有一些编译器选项来防范这种情况?通过显示内存转储,很明显这种边界的超越是真实的.有没有办法声明变量或参数规范来捕获它?显然这是一个明显的案例,但是当负责维护数千行F77派生代码时,(对我来说)是否可能发生这种情况并不总是很清楚.
PROGRAM TEST_CODE
IMPLICIT NONE
INTEGER*4 :: R(5) ! Array of 5
CALL R_TEST(R, 10)
END PROGRAM
SUBROUTINE R_TEST(R, J)
IMPLICIT NONE
INTEGER*4, INTENT(INOUT) :: R(1) ! Dummy is array of 1
INTEGER*4, INTENT(IN) :: J
INTEGER*4 :: K
DO K=J-5,J+5 ! K=5..15
R(K) = K ! No Runtime Error
END DO
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)
编译器是英特尔Fortran 2011 XE,是的我使用字节规范,INTEGER*4
因为我知道我得到它.
以下是运行时检查的编译器选项.
我想检查给定的坐标是否与数组有关.
public boolean checkBounds(int x, int y) {
try {
Object val = array[x][y];
return true;
} catch (ArrayIndexOutOfBoundsException e) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我能这样做吗?这是一种有效的方法吗?
我们最近从 Delphi Berlin 更新到 Alexandria 11.2,并遇到了问题。我们的应用程序之一针对 64 位平台。当它连接查询 Windows 服务时,它会抛出范围检查错误。当以 32 位为目标时,它不会执行此操作;柏林/64 位也没有发生这种情况。我比较了两种环境之间的 64 位编译选项,没有发现任何差异。
function TForm1.ConnectToServices(const AServiceName: String; const AMachineName: String): Integer;
begin
Result := -1;
try
if AMachineName = EmptyStr then
// Error happens here
Result := OpenSCManager(nil, nil, SC_MANAGER_CONNECT)
else
// and here.
Result := OpenSCManager(PChar(AMachineName), nil, SC_MANAGER_CONNECT);
except
// Get last error return 0, but ignoring the above error causes problems downstream
ShowMessage(SysErrorMessage(GetLastError));
end;
end;
Run Code Online (Sandbox Code Playgroud)
我真的不知道是什么原因造成的以及如何解决它。
设置 64 位编译器选项以匹配 Berlin 的编译器选项,其中 dll 调用成功且没有问题。