雷鹏ID:whinah
20009次访问,排名5811(2)好友2人,关注者5
嵌入式两年,安全两年,现今搜索
whinah的文章
原创 42 篇
翻译 0 篇
转载 0 篇
评论 13 篇
最近评论
whinah:客气、客气,这个RPC之后我也再没继续深入。打造一个稳定而强大的基础设施需要太大的精力。目前我们使用ICE,有兴趣可以去关心一下。前不久我在boost sandbox 中看到了一个rpc,没细看,估计在参数传递方面和我的设计思想差不多,不过它底层用的是boost.asio。
zm0011:在开发网络通讯程序中很有用,正想自己写一个,竟然百度出来了。顺便看了一下老兄的其它文章,数量不多但水平比较高,而且涉足的领域很多哦,从WIN到LINUX、从C++壳到数据库都有。希望能看到你奉献更多的好东东,谢谢!
whinah:这里只考虑了简单性,atl 这种手工打造虚表的方法的确可以节省存储空间,但是繁琐了一些。
nico:有没有考虑过 ATL/WTL 里用到模拟虚函数?

template <class T>
class foo
{
int& get_n()
{
T* pT = (T*)this;
return pT->n;
}
}

class bar : foo<……
whinah:如果真要实际使用这种技术,字符串文字量也必须经过地址转换,如:
convert_address("string literal")
文章分类
    收藏
      相册
      我的相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 千万注意,不要 hack std::string收藏

      新一篇: gcc 一个恶心的 bug | 旧一篇: 前缀压缩词典

      前段时间被一个bug折磨了两个星期,最后发现竟然是如此一个陷阱——我为了减少内存用量并且减少一次内存拷贝,直接通过string.data()修改了string的内部表示。这与其说是一个陷阱,不如说是我自己给自己造了一个陷阱然后把自己给掉进去了。发病机制可以用如下代码简单的勾画出来:

      using namespace std;

       

      int main(int argc, char* argv[])

      {

          string str1 = "abcde";

          string str2 = str1;

       

          strcpy(const_cast<char*>(str2.data()), "1234");

       

          cout << "str1=" << str1 << endl

               << "str2=" << str2 << endl;

       

          return 0;

      }

       

      在windows+msvc 中的输出是:

      str1=abcde
      str2=1234


      在linux+gcc中的输出是:

      str1=1234
      str2=1234

      在boost::serialization中,对string的load也是采用这样的hack方式,目的也是为了减少内存用量并且减少一次内存拷贝。使用boost::serialization的同志们需要注意,不要掉进这个陷阱!

      我们可以看出,在msvc中,string拷贝时是真拷贝,而在gcc中,必定是用了引用计数+copy on write。str1和str2内部引用的是同一块内存。因为string.data()和string.c_str()都是const成员,所以不会有copy,只会增加引用计数。所以导致修改str2实际上也修改了str1。

      c++标准甚至允许把const string的成员放入带写保护的内存区域中,或者把string的成员实际上存储在不相邻的内存块中,而仅在调用 string.data() 或 string.c_str() 时将数据拷贝到一块临时内存中然后返回,这块临时内存将在下一次调用string的一个非const成员函数时释放,如果目标平台真这样实现,往 string.data()中写数据就会导致更加微妙的错误。

       

      发表于 @ 2007年02月25日 14:49:00|评论(loading...)|编辑

      新一篇: gcc 一个恶心的 bug | 旧一篇: 前缀压缩词典

      评论:没有评论。

      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © whinah