Mic*_*ick 14 c++ visual-studio-2008
我正在将一个非常庞大且非常古老的(25年!)程序从C转换为C++.
在其中有许多(非常非常多)的地方,我使用各种整数索引访问全局一维UBYTE数组.有时这个指数可能是负面的.
我有时候,但并非总是如此,陷入困境,并确保没有出错,但作为一个腰带和大括号的测量,我实际上遇到了麻烦,确保在阵列前面有另一块内存并用右边填充它这样的值,如果我不小心省略了陷阱负数条件,那么仍然会在数组访问中获取正确的答案.这实际上很多年都很好.
但是现在在C++下,似乎访问具有负数的数组的行为有所不同,现在我的程序运行得很糟糕.我修复了一个未处理的负数的情况,程序似乎工作正常,但我很紧张,我没有陷入所有的负数,可能会有问题.
所以现在我的问题是,在运行时,有没有办法检测任何访问具有负索引的数组的实例?如果有人能想出答案,我会留下深刻的印象.如果你非常肯定它不能以任何自动方式完成,那么告诉我这也是有价值的信息.
我应该补充一点,我不是一个真正的C++程序员(还).到目前为止,我所做的只是绝对最低限度(几乎没有)让程序在C++编译器下编译.因此,如果您的答案涉及花哨的"专家,C++解决方案",那么请尝试用一个音节的单词解释或给我一个链接,以便我可以查找它.
Jor*_*ans 26
你能用一个带有重载operator []的对象替换全局一维ubyte数组吗?使用int输入的绝对值可能会解决您的一些问题.
编辑:根据数组的使用模式(没有指针shenanigans),使用具有重载operator []的对象实际上对数组的用户完全透明,因此我的建议.
你知道指数的界限吗?
在Siyfion的回答下阅读评论,似乎在您的问题域中允许负指数,因此试图强制所有指数为正数是没有意义的.一个更好的解决方案是允许负指数而不破坏任何语言规则(你的C版本也做了btw.你很幸运它没有爆炸;))
因此,如果您知道要使用的索引在-x到y的范围内,只需创建一个大小为x + y的数组,并在访问该数组时使用指向第x个元素的指针.
例如,假设您需要一个索引为-4到5的数组:
int arr[10];
int* ptr = arr+4;
// use ptr when you need to index into the array:
ptr[-4]; // is valid, reads arr[0]
ptr[5]; // is valid, reads arr[9]
Run Code Online (Sandbox Code Playgroud)
当然也可以(而且应该)用C完成.
另一条建议是不直接访问原始数组.改为定义简单的访问器功能.(例如,但不一定,通过将数组放在一个类中.如果你把它放在一个类中,你可以重载operator [],所以它甚至看起来像一个数组)
这个开销恰好为零(不是"接近零,或者接近于零,你不会注意到差异",但是为零.生成的代码与你直接访问数组的代码完全相同),因为编译器将内联短函数,但它还允许您插入额外的检查,以便您可以在调试版本中验证您永远不会超过数组的边界.
| 归档时间: |
|
| 查看次数: |
13873 次 |
| 最近记录: |