比较变量地址并不可靠
来源:互联网 发布:淘宝自动发货机器人 编辑:程序博客网 时间:2024/05/21 17:30
“用比较地址的方法来判断两个变量(的引用)是不是同一个变量是不可靠的”,这个问题很简单,却也容易忽视。
现实的情况是这样的。在写Computer Vision实验的时候,因为程序要面临的计算量往往很大,对程序的性能的优化是十分重要的。
所以我就写出了这样的代码:
void foo_func(Foo& foo){ //< 如果foo和上次传入的是同一个,就省掉一部分重复计算 static Foo *p_foo = NULL; if (p_foo != &foo) { p_foo = &foo; //< 大量计算 } //< 后续计算}
在实验里,Foo这个类本身往往比较复杂,不可能做内容的逐一比较,同时这个类的实例在初始化之后内容就保持不变。写这个函数的时候没有觉得有什么问题,结果也是正确的。
但是,这么做显然是不可靠的。
这段代码就说明问题了:
#include <iostream> int main(int argc, char **argv){ using namespace std; for (int i = 0; i < 100; i++) { int j; cout << "i: " << i << " &j: " << &j << endl; } return 0;}
在Mac下输出是这样的:
i: 0 &j: 0x7fff52decad0i: 1 &j: 0x7fff52decad0i: 2 &j: 0x7fff52decad0i: 3 &j: 0x7fff52decad0i: 4 &j: 0x7fff52decad0i: 5 &j: 0x7fff52decad0i: 6 &j: 0x7fff52decad0i: 7 &j: 0x7fff52decad0i: 8 &j: 0x7fff52decad0i: 9 &j: 0x7fff52decad0....
编译器在分配内存的时候,会去复用之前刚刚释放掉的空间,这个是很显然的道理。在上面这种循环里面,局部变量所在的那块空间正好一直被同一个变量复用,如果我每次给j初始化不同的值,它们的地址一致但却不是同一个变量,所以像这样比较变量地址并不可靠。
现在看来,一个可能的解决方法就是给Foo的每一个实例增加一个唯一的ID了。
有没有不用修改Foo就能达到快速比较两个Foo实例的方法呢?
- 比较变量地址并不可靠
- C++对象指针比较比较的并不是地址值
- 正确理解tcp的可靠传输------其实并不100%可靠
- 结构体类型的变量名并不能直接当作地址使用,这一点和基本数据类型相同。(修改版)
- 以String类来说java变量地址和值比较
- 哪家市场调查公司比较可靠
- 比较两个字符串并不区分大小写
- 变量比较
- 诺基亚想逃出生天,问题是微软的WP7并不是可靠的“诺亚方舟”
- Java 在try中return的值并不可靠,所以会出现编译错误
- 此前令人沮丧的消息并不可靠 下一代Sony游戏主机依然保留光驱
- jQuery.position()对不同浏览器的支持,并不可靠(一,问题描述)
- jQuery.position()对不同浏览器的支持,并不可靠(二,问题解决)
- python类变量与 C++的静态变量并不等效
- 并不
- 安全可靠的3G传输中IP地址的解决方案
- Android:获取设备的mac地址可靠的方法
- 最新可靠好用的DNS服务器地址汇总
- 在qt creator 编译 ubuntu 上的多媒体程序
- SPI,PCI,PCI、ISA,SSI、SPI,CAN总线
- Linux下protobuf-c的安装
- BeeFramework
- 关于OBJECT标签
- 比较变量地址并不可靠
- 风雨十年:一个老程序员的心里话(上)
- jqGrid表格插件——参数配置
- 使用SqlDependency监听MSSQL数据库表变化通知
- Direct2D入门
- java发送udp广播包
- 外观模式(Facade)
- C++面试宝典
- The iPad Split