re: 静态库中全局变量的初始化问题 李现民 2011-11-07 10:35
@Kevin Lynx
这个问题后来我试过,在我的项目里( 前面提到的,使用了VC6),问题出在使用singleton生成单个factory对象的地方。如果将factory的构造函数设计为private,同时提供一个类get_instance()的public static方法,会产生多个factory实例。具体表现就是,register()函数的确执行了, 但是所有的注册内容都注册到了第一个factory对象身上,等到运行期使用create方法的时候,使用的却是后面新生成的factory对象,因此会发生没有注册过的假象。
解决方法为:将factory()构造函数声明为public,在factory类外面定义一个singleton函数,并一直使用这个函数进行注册与创建。但这种方法的缺点是你无法从语法上确保所有用户使用的都是这个singleton对象。
怀疑为VC6的bug,不过由于已经基本满足了需要,未继续深究。
你可以用&sname[0], 如果觉得不安全可以用strdup(sname.c_str()), 会返回一个copy
@oldman
对, 无法区分跨多行的/**/注释的后面部分
@simon
不,其实这个不容易看出来, 是因为网页的名字叫peak.html,peak与pickle谐音,很扯的理由, 哈哈
兄弟你是完美的吧? 这个框架我在内部bbs上见过, 但rtx上怎么没有你的名字呢?
@simon
你去看一个网页的源代码,里面有一个链接, 你点一下会出现 and the next nothing is 92512, 替换Url里linkedlist.php?nothing=12345中的12345,然后再回车, 你就会发现规律了
@oldman
&str[0]的数据是可以修改的, 而str.data()的数据不能修改
re: 最近笔试面试集锦(c/c++) 李现民 2011-05-06 12:24
判断是否为奇偶数可以用(a&1), 取最后一位,是0则为偶数,是1则是奇数
re: 一道C++面试题的误区 李现民 2011-05-06 12:19
自己试了一把, 还真是这样, 真悲剧啊
switch语句被汇编翻译的结果与case的长度及数值规律有密切关系,并不是简单的翻译成跳转表, 同时与编译器的优化能力也有关。
你可以看一下这篇文章:
http://www.cppblog.com/besterChen/archive/2009/12/07/102682.html
re: 游戏客户端与编辑器代码重用设计杂谈 李现民 2010-12-13 15:53
@right
:) 跟vc6不能说关系大, 也不能说没有关系。但就本篇所表达的思想讲,您可以认为是独立于vc6的
宝贵意见,非常感谢!
re: 编程习惯(2) 李现民 2010-12-07 21:10
代码是简洁了, 但阅读起来更费神了。为什么要写成这样呢? 生成的汇编代码应该是一样的
re: C++多态技术[转贴] 李现民 2010-12-07 10:49
文章很好, 我也保留一份, 嘿嘿
re: bash 常用东东 李现民 2010-12-04 17:30
留名,学习
re: 冒泡和选择排序该被踢出教材了(转) 李现民 2010-11-28 09:35
@oldman
对您提出的意见表示感谢
但是, 这文章是转csdn上的一篇帖子,帖子的地址您可以在文章的最开始处看到,基于尊重原创的想法,我觉得还是不要去修改的好。
再次表示感谢!
re: const灵异现象 李现民 2010-11-25 09:25
@fool
支持你一下, 哈哈
观察者模式应用起来的确有些复杂,也许你可以考虑仿写一个c#的delegate,这样的话可以支持多播, 而且编程实现上要简单不少。
re: c++编程习惯(1) 李现民 2010-11-23 22:11
A arr[10]={0}; 的生成汇编中就调用了memeset,但前者比后者还多了一个赋值,因此还要稍慢一点 :D
re: const灵异现象 李现民 2010-11-23 18:20
@classyk
我的理解:volatile const其实是变量可以不可预期的被程序以外的环境所改变,而对于相同的一段程序内部而言,这样声明并不能使你有更好的方式可以修改此变量的值
re: const灵异现象 李现民 2010-11-23 18:16
@vincent
在默认情况下,其实不是这样的。
const 修饰内置数据类型时,比如const int a= 10; 则a是一个编译期常量,因此你可以进一步定义int b[a]= {0}; 在编译意味着它没有内存地址(这是一个运行期的概念),因此并不存在放置于只读数据段的现象。
只所以说是“默认情况”,是因此在更复杂的情况下const常量对象是需要分配内存的,比如说文章中出现的取其地址的时候,再比如定义更加复杂的集合对象的时候。
re: const灵异现象 李现民 2010-11-22 19:37
@冬瓜
可不仅仅是这样的,对于修饰为const的变量,编译器可能会去做一些处理,表现在有无const,最终生成的汇编代码很可能是不同的
re: const灵异现象 李现民 2010-11-22 15:40
@airtrack
受教了, 呵呵, 第一次听说这个词, 谢谢
@陈梓瀚(vczh)
这是为什么? 好像stlport中std::string的operator= 就是用memcpy实现的吧
fastdelegate, 前两天还真看见公司的一个项目上用到它了, 看实现应该很快,不过可惜的是不支持多播
re: C++通用删除器设计 李现民 2010-11-17 19:42
@星绽紫辉
呵呵, 受教了
re: C++通用删除器设计 李现民 2010-11-17 17:58
@冬瓜
是这样的, 大家觉得如果直接用shared_ptr的话就没有必要写一个delete_null函数了
re: C++通用删除器设计 李现民 2010-11-17 10:40
@Jeff
没有, 非常欢迎你的评论。大家的回复让我想了很多,这些都是非常意外而重要的收获。
其实, 最直接的问题是:我没有权利在项目中引入一个像boost 这样大的库,因此这不但限制了应用,也限制了我的眼界。
re: C++通用删除器设计 李现民 2010-11-17 10:36
@陈梓瀚(vczh)
看了这么多回复, 如果我没想错的话,是不是大家都推崇使用shared_ptr替代原始对象指针?如果多数人都这认为的话,那肯定是有道理的。如你所言,看来有时间我得去仔细研究一下shared_ptr了。
我现在能想到的问题是,假如我自己写了一个shared_ptr加入到了旧的项目中,那么所有其它使用该对象的地方(包括参数)是否都必须带着shared_ptr<T>的声明呢?
感谢回复,不忙的时候研究一下。
re: C++通用删除器设计 李现民 2010-11-16 11:16
@空明流转
我所指的“不稳定”是指boost一直在开发,里面有长期积累下来的库,也有新加入的库,只是加入到项目中,新库在未证明其稳定性之前也有可能被使用,而这可能导致一些问题。
另外, 你说得对,相比于资源的分配与回收,shared_ptr的开销是可以忽略的,但我们的系统中现在还没有这样的机制,而且我说过了,真正的原因是我尚未发现让我不得不用它的理由。
最后, 我其实是很赞同使用RAII的,实际上,我们已经在陆续使用它了。
感谢回复!
re: C++通用删除器设计 李现民 2010-11-16 09:18
@Jeff
唉, 这批评还真犀利呀!
1. 不直接使用boost中的智能指针最直接的原因是boost不稳定,而且并不是boost中的所有特性都对项目有帮助的。你可能会问为什么我不自己实现一个,一个类似于shared_ptr的东西,除了那一点性能损失外,真正的原因是我还没有发现让我不得不用的理由。而且,项目中有很多地方是不能直接调用析构函数的,而是需要单独写一个Destroy的函数,因为时机。
2. 关于异常安全,我想,如果析构函数本身是异常安全的话,那么我的代码本身应该算异常安全了吧?反之,如果析构函数本身不安全的话,那无论采用什么方法析构都是有问题的。
如果我的想法有什么问题的话,请不吝指正,非常感谢。
re: Vim操作技巧札记(一) 李现民 2010-11-08 09:33
直接输入行号按下G就可以跳转到指定行
re: Switch结构学习笔记 李现民 2010-11-03 10:56
好文章, 非常细致
re: 素数查找 李现民 2010-09-29 10:14
memset是一种高效的数组初始化方式,它本身是用汇编写的,vc下应该是位于memset.asm中,当你使用部分初始化时, 比如int a[100]={0}, 你会看到它的汇编代码其实用的就是memset。
把sqrt(N)拿到外面那个, 你不觉得你的代码中每次循环sqrt(N)都会调用一遍嘛?当然, 现代编译器的话,这种简单的调用可以被优化掉,但作为码农, 你不应该写成这样
re: 素数查找 李现民 2010-09-28 19:04
不要使用using namespace std; 因为std命名空间里的东西全是一些常见的名字, 像string, vector, list等等,直接使用std::string,以防止重名
#define N 100可以使用const常量代替(并且,尽量放到一个空的namespace下),否则你需要定义成#define N (100),加括号,这是常识
prim[i]=true;的那个循环可以改成memset(&prim, 1, sizeof prim)
for(i=2;i<=sqrt(N);i++)---请把sqrt(N)拿到循环外面来
看你写代码的样子,应该是vc6吧,把int i,j;放后面点吧,不过在在未使用的地方就定义变量,比如int j完全可以放到循环内部定义
re: 接口,虚函数及纯虚函数 李现民 2010-09-28 18:44
分得太细反而着了相, 不要太看重语法上的区别,这些东西都是基于应用而衍生的,多研究一些设计的东西, 比仔细区分这些语法概念要合算
re: 这是个很狡猾的bug。 李现民 2010-03-09 10:09
-__-看不出来
re: 静态库中全局变量的初始化问题 李现民 2010-02-10 12:14
@金庆
不好使
我想应该是这个问题:
Only problem is that the symbol is not very...simple. I have a class called fxAttributeEditor, but you can't just do /include:fxAttributeEditor. The symbol is actually:
??_C@_0BC@OFGGEBAJ@fxAttributeEditor?$AA@
And that does work, but having to add that seems like a terrible coding decision. It seems like going the dynamic library route would be far better. I've had a variety of really good reasons for not wanting to do that. I'm not against DLLs, but in some cases (like mine) I don't believe it's the best choice. Is there not any better way to go about this?
Thanks,
这是引用原文, 大概意思是“不能够在#pragma comment(linker, /include:)中直接使用你定义的那个变量名”,因为c++编译时会将其改为??_C@_0BC@OFGGEBAJ@fxAttributeEditor?$AA@这样的的形式。
我不知道是不是真的这样, 但我的实验结果是找不到我自己定义的变量名
re: 静态库中全局变量的初始化问题 李现民 2010-01-20 19:44
我以前也试过这样的方法, 项目用的是vc6,只debug版本下对象是可以生生的,release版本中就被人优化掉了,没有找到保持这种级别低耦合度的替代方案。
到现在为止, 我写的那个factory类再也没有用过,因为看不到优势在哪里, 还不如现写一个工厂来得清晰
@xu
提供功能性接口,去完成有意义的操作,尽可能的不要暴露数据成员
re: IM在线查看器 软件下载 李现民 2009-11-16 10:06
厉害, 这都行
re: 微软的面试题 李现民 2009-09-21 09:28
这种题只能拿来随便练练, 每个面试官都会出自己的题
re: VC6中的简易delegate实现 李现民 2009-09-07 09:20
@free2000fly
这个是单播的、面向编译器的
re: VC6中的简易delegate实现 李现民 2009-09-02 17:39
@foxriver
呀,意外之喜,同样谢谢你,哈哈
re: VC6中的简易delegate实现 李现民 2009-09-01 21:07
@OwnWaterloo
不过你说的那三种语法中的第三种,VC6肯定支持,呵呵,现在正在向第二种努力
re: VC6中的简易delegate实现 李现民 2009-09-01 21:05
@OwnWaterloo
恐怕暂时不会去试boost了,其实我到想,但公司明确禁止在项目中使用boost。我曾经试过,被上司否定了
re: VC6中的简易delegate实现 李现民 2009-09-01 21:03
@陈梓瀚(vczh)
我也不想用啊,但我只是个兵啊,这不是没有办法么,呵呵