由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - std::size_t的麻烦
相关主题
问一个Fortran和C++科学数值格式输出区别的问题一个hash table的简单问题
C++中size_type怎么处理?关于Dword 和 word
What is size_t mean in C?Any possibility to make this expression faster?
is size_t recommended for 64-bit windows porting?这个面试题有什么trick?
狠偷懒狠偷懒的一个测试[合集] reinterpret_cast a 4 byte unsigned char to integer
问一个在C里面转换十六进制的问题[合集] 讨厌的WARNING: 在 MANAGED C++ 中写东东
一道面试题pointer overflow
有没有什么简单的方法从一个double precision的floating point 中读出一个特定的bit?C++ 初学者请教一个 iostream 的问题
相关话题的讨论汇总
话题: size话题: int话题: std话题: c++话题: unsigned
进入Programming版参与讨论
1 (共1页)
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
: 没有查到有这个 是标准库的么?

1 (共1页)
进入Programming版参与讨论
相关主题
C++ 初学者请教一个 iostream 的问题狠偷懒狠偷懒的一个测试
C++怎么写任意重重循环?问一个在C里面转换十六进制的问题
Need help on C++ code一道面试题
新手请教:C++ decrement loop有没有什么简单的方法从一个double precision的floating point 中读出一个特定的bit?
问一个Fortran和C++科学数值格式输出区别的问题一个hash table的简单问题
C++中size_type怎么处理?关于Dword 和 word
What is size_t mean in C?Any possibility to make this expression faster?
is size_t recommended for 64-bit windows porting?这个面试题有什么trick?
相关话题的讨论汇总
话题: size话题: int话题: std话题: c++话题: unsigned