y**b 发帖数: 10166 | 1 一是写起来麻烦,不像int那么简便,当然现在很多地方可以
用auto替换,但仍然很多地方不行;
二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。
要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。
至于递减,C++ primer第五版为了保证永远>0将变量预先加一的
做法既不具备普遍性,也容易出错。
对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句:
for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip +
maxGrid + 1, gridNx); ++i)
难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
还有一个更严重问题就是,C++不能像Fortran那样运行时检测数组
或向量越界,这点在科学计算里面调试程序也是个恶梦。vector.at()
虽然可以检测越界,但是远没有调试模式方便。 |
L****8 发帖数: 3938 | 2 size_t 要求保证a-b>=0
没看懂 啥意思?
+
【在 y**b 的大作中提到】 : 一是写起来麻烦,不像int那么简便,当然现在很多地方可以 : 用auto替换,但仍然很多地方不行; : 二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。 : 要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。 : 至于递减,C++ primer第五版为了保证永远>0将变量预先加一的 : 做法既不具备普遍性,也容易出错。 : 对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句: : for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip + : maxGrid + 1, gridNx); ++i) : 难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
|
y**b 发帖数: 10166 | 3 std::size_t a=1, b=2;
a-b会得到无符号数的模-1,是个巨大无比的正数,
这类东西要是放在科学计算里面,
完全就是坑啊:
本来用size_t取代int定义一些自然条件和大数值更合理,
可是一旦两个size_t相减,控制条件就飞到九霄云外了,
等你费尽力气调试程序,却发现原来是这么一个荒谬的玩意。
多年前我就遇到过一次。 |
w***g 发帖数: 5958 | 4 相对size_t还有off_t。其实size_t还是解决不了问题,得用size64_t。
+
【在 y**b 的大作中提到】 : 一是写起来麻烦,不像int那么简便,当然现在很多地方可以 : 用auto替换,但仍然很多地方不行; : 二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。 : 要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。 : 至于递减,C++ primer第五版为了保证永远>0将变量预先加一的 : 做法既不具备普遍性,也容易出错。 : 对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句: : for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip + : maxGrid + 1, gridNx); ++i) : 难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
|
c****y 发帖数: 11 | 5 size_t带来很多不便,其实size用int或者int64最好。超出int64表示范围的大数字,
自己想办法。
+
【在 y**b 的大作中提到】 : 一是写起来麻烦,不像int那么简便,当然现在很多地方可以 : 用auto替换,但仍然很多地方不行; : 二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。 : 要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。 : 至于递减,C++ primer第五版为了保证永远>0将变量预先加一的 : 做法既不具备普遍性,也容易出错。 : 对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句: : for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip + : maxGrid + 1, gridNx); ++i) : 难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
|
L****8 发帖数: 3938 | 6 看了一下 std::size_t 大致相当于 unsigned long long
我现在是自定义 int_max = long long
彻底不用 unsigned
【在 y**b 的大作中提到】 : std::size_t a=1, b=2; : a-b会得到无符号数的模-1,是个巨大无比的正数, : 这类东西要是放在科学计算里面, : 完全就是坑啊: : 本来用size_t取代int定义一些自然条件和大数值更合理, : 可是一旦两个size_t相减,控制条件就飞到九霄云外了, : 等你费尽力气调试程序,却发现原来是这么一个荒谬的玩意。 : 多年前我就遇到过一次。
|
y**b 发帖数: 10166 | 7 彻底不用unsigned倒是安全。
int的实现早就是32bit了,所以用int的地方,也不容易出错,除非明确有64bit的要求。
【在 L****8 的大作中提到】 : 看了一下 std::size_t 大致相当于 unsigned long long : 我现在是自定义 int_max = long long : 彻底不用 unsigned
|
i******l 发帖数: 270 | 8 你如果有可能相减,或者有正反两个方向的移动,应该用 ssize_t
+
【在 y**b 的大作中提到】 : 一是写起来麻烦,不像int那么简便,当然现在很多地方可以 : 用auto替换,但仍然很多地方不行; : 二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。 : 要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。 : 至于递减,C++ primer第五版为了保证永远>0将变量预先加一的 : 做法既不具备普遍性,也容易出错。 : 对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句: : for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip + : maxGrid + 1, gridNx); ++i) : 难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
|
d***a 发帖数: 13752 | 9 “难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?”
这是C语言的问题,C++继承过来了。a-b越界是run-time出现的,编译器不能警告(除
非a-b是编译时可计算的常数表达式)。
效率高的解决方法有,可以写汇编语言,在每次a-b后检查CPU的carry flag,比用std:
:max快。但从编程效率来说,这不是什么好办法。
用int或unsigned int,从机器语言来说是一样的结果。比如说1-2,实际上是
0x00000001-0x00000002 = 0xFFFFFFFF,0xFFFFFFFF解释成int就是-1。
+
【在 y**b 的大作中提到】 : 一是写起来麻烦,不像int那么简便,当然现在很多地方可以 : 用auto替换,但仍然很多地方不行; : 二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。 : 要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。 : 至于递减,C++ primer第五版为了保证永远>0将变量预先加一的 : 做法既不具备普遍性,也容易出错。 : 对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句: : for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip + : maxGrid + 1, gridNx); ++i) : 难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
|
P*******L 发帖数: 2637 | 10 unsigned 的确导致很多问题,size_t 就应该定义成有符号整数
Google protobuf 里的 RepeatedField 在设计时就用 int 而不是 size_t
+
【在 y**b 的大作中提到】 : 一是写起来麻烦,不像int那么简便,当然现在很多地方可以 : 用auto替换,但仍然很多地方不行; : 二是size_t类型的递减,或者两个size_t之间的减法更是恶梦。 : 要求保证a-b>=0,这简直是荒谬,模拟实际问题时根本无法做到。 : 至于递减,C++ primer第五版为了保证永远>0将变量预先加一的 : 做法既不具备普遍性,也容易出错。 : 对a-b这种情况,我只好(int)a - (int)b。当年写出这种恶句: : for (std::size_t i = std::max((int)ip - (int)maxGrid, 0); i < std::min(ip + : maxGrid + 1, gridNx); ++i) : 难道就没有什么好办法?还有C++为什么不对a-b这种情况给予编译警告?
|
L****8 发帖数: 3938 | 11 http://en.cppreference.com
没有查到有这个 是标准库的么?
【在 i******l 的大作中提到】 : 你如果有可能相减,或者有正反两个方向的移动,应该用 ssize_t : : +
|
r*****z 发帖数: 906 | 12 在posix里,不在C/C++ standards里
【在 L****8 的大作中提到】 : http://en.cppreference.com : 没有查到有这个 是标准库的么?
|