[百度空间] [note] pointer to member is a POD type

C++03 3.9-10:


1

Arithmetic types (3.9.1), enumeration types, pointer types, and pointer to member types (3.9.2), and cv-qualified versions of these types (3.9.3) are collectively called scalar types. Scalar types, POD-struct types, POD-union types (clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called POD types.

 

As we all knows the pointer to member may not be cast into void* (GCC is OK but it‘s a special case anyway), according to the standrad we can store the pointer to member to a char buffer though. Unfortunately, the size of "pointer to member" is implementation defined, so we still need some hack for different compilers.

here‘s a table for sizeof(pointer to member) for some compilers

(http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


Compiler            Options     Single  Multi   Virtual Unknown

    MSVC                        4       8       12      16

    MSVC            /vmg        16#     16#     16#     16

    MSVC            /vmg /vmm   8#      8#      --      8

    Intel_IA32                  4       8       12      16

    Intel_IA32      /vmg /vmm   4       8       --      8

    Intel_Itanium               8       12      16      20

    G++                         8       8       8       8

    Comeau                      8       8       8       8

    DMC                         4       4       4       4

    BCC32                       12      12      12      12

    BCC32           /Vmd        4       8       12      12

    WCL386                      12      12      12      12

    CodeWarrior                 12      12      12      12

    XLC                         20      20      20      20

    DMC small                   2       2       2       2

    medium                      4       4       4       4

    WCL small                   6       6       6       6

    compact                     6       6       6       6

    medium                      8       8       8       8

    large                       8       8       8       8

the original article implement each compiler‘s pointer to member mechanism, which I believe is insane, it‘s definitely not a good way to write portable codes.here‘s what I‘m doing (code snippet).

所以pointer to member 可以被保存在byte array 里面再被解出来.这对于做delegate很有帮助.这是我目前使用的方法.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34


class Delegate

{

public:

//per-compiler constant, or use a max enough size for all compilers

#if COMPILER == COMPILER_MSVC

    static const size_t MAX_POINTER2MEMBER_SIZE = 16;

#elif COMPILER == COMPILER_GNUC

    static const size_t MAX_POINTER2MEMBER_SIZE = 8;

#else

    static const size_t MAX_POINTER2MEMBER_SIZE = 20;

#endif

    void* mPtr;

    char  mMemberRaw[MAX_POINTER2MEMBER_SIZE ];

    //store the pointer to member to a byte buffer

    template <typename T>

    explicit Delegate(T* ptr, void (T::*func)(void*) )

    {

        assertsizeof(func) <= MAX_SIZE );

        ::memset(mMemberRaw, 0, MAX_SIZE);

        ::memcpy(mMemberRaw, &func, sizeof(func) );

    }

};

//invoke function: extract the "pointer to member" from the byte buffer

{

    ...

    typedef void (T::*TMemberFn)(void*);

    TMemberFn TFn = NULL;

    ::memcpy(&TFn, mMemberRaw, sizeof(TFn) );

    ( ((T*)mPtr)->*TFn )( data);

}

there‘s a very efficient way to do the delegate :

http://www.codeproject.com/Articles/11015/The-Impossibly-Fast-C-Delegates

他也是用模板函数,但不同的是把函数地址作为模板参数.本来打算改用这个方法的.但是唯一的缺点就是需要显式指定模板参数<>来实例化, 而构造函数只能通过TAD来套用模板参数,不能显式指定...所以他用的是一个静态模板函数来构造一个对象


1

delegate d = delegate::frommember<T,&T::func>( pOjb); //这样稍微有点恶心.

而我使用的方式虽然多了一个char[], 有一点点额外的内存开销和运行时开销,但是大多数情况下几乎可以忽略不计.

主要是可以通过Template Arugment Deduction 直接创建delegate, 比如:


1

Delegate d(pObj, &CLASS::function);

所以考虑了一下,决定暂时不用他的那种方法(用起来稍微不方便,但是效率非常高).以后看情况再考虑要不要改.

另外,作为一个C++程序猿, 个人觉得"数据绑定", "反射","代理",这些使用时尽量谨慎, 不可滥用. 除了在event/msg 和 UI/Tools的极少数地方要用以外,其他地方还是尽量不要用为好. 最近把数据绑定框架做了简单重构, 幸好用到的地方不多(主要是编辑器在用), 要不然重构就哭了. 目前还没有反射,暂时不需要, 以后需要时再加.最好是另外封装,不影响现在的代码.

时间: 2024-10-22 21:16:46

[百度空间] [note] pointer to member is a POD type的相关文章

百度空间代码大全

display:nonecss全能隐藏代码 背景{}中添加background: url(图片地址)repeat注:repeat 背景图像在纵向和横向上平铺no-repeat 背景图像不平铺repeat-x 背景图像在横向上平铺repeat-y 背景图像在纵向平铺 line-height: 25.2px;">超链接自定义设置超链接的属性就是在相关栏目名称后面+上a{}的属性 color:#颜色代码或颜色英文名称 定义超链接字体的颜色font-family:字体名称 定义超链接字体font-

Eclipse启动之四 : Eclipse核心框架启动(百度空间迁移)

框架启动位于org.eclipse.osgi_<version>插件中,入口为org.eclipse.core.runtime.adaptor.EclipseStarter.run(String[] args, Runnable endSplashHandler) 其中最主要的方法是Startup方法,其主要功能: 1.初始化框架属性信息     FrameworkProperties 2.处理命令行参数 3.初始化LocationManager 4.加载config.ini中配置信息 5.创

Eclipse启动之二:Eclipse动态库(百度空间迁移)

动态库中的主要实现文件是:eclipse.c 其主要功能定位启动Java虚拟机和显示Splash窗口(暂未用,通过在org.eclipse.equinox.launcher.Main中调用来显示) java虚拟机定位算法: 1.从-vm参数所指定的文件或目录中查找 2.如果没有指定-vm参数,程序会寻找Eclipse自带的JRE,它会在当前目录中查找jre\bin\javaw.exe 3.按照系统的环境变量指定的路径去查找javaw.exe 其中,通过-vm参数指定虚拟机位置可以有多种选择: 1

Eclipse启动之三 : 启动器插件(百度空间迁移)

Eclipse启动之三启动器插件 空间 启动插件名为org.eclipse.equinox.launcher.<version>,入口类org.eclipse.core.launcher.main.它是Eclipse虚拟机启动的最早的插件 main整体流程: 1.处理命令行参数 2.设置虚拟机属性 3.处理配置 4.获取安装路径 5.获取启动路径 6.加载JNI动态库 7.设置安全属性 8.处理闪屏 9.启动Eclipse核心框架 1.处理命令行参数           解析命令行参数 -sh

“百度空间关闭”后的问题解决攻略

4月7日消息,运营八年的百度空间今日宣布关闭,百度空间的内容将于5月7日正式迁移到百度云. 公告显示,从今年4月21日起,百度空间停止编撰更新博文,博文内容迁移后只对自己可见. 针对百度空间关闭的问题,多备份为您提供完整的解决攻略. 第一步:根据自身情况寻找一个主机商,购买虚拟主机; 第二步:进入多备份,联系客服索取博客快速建站脚本; 第三步:将快速建站脚本上传到虚拟主机的FTP中,然后用域名访问该文件,选择个人喜欢的博客程序,下载解压,然后访问域名安装.安装完成即可实现自建博客; 第四步:自建

转自 x_x的百度空间

空华人生         by 淡漠的心情 昨天,又昨天. 今天,又今天. 明天,又明天. 日历渐渐稀薄,忽然发现,那是时间的痕迹. 似乎,总是在麻木的等待. 何时,才能历尽. 再算算,我又还有多少天能够挥霍. 上天,又还会给我多少天. 人生短暂. 日子,总有过完的一天. 而我,又能做些什么. 发呆?叹气?还是努力?深思着...... 或许,这些事.不该我烦吧.若烦,是自寻烦丝. 记得有句话说:要顺其自然,开心点. 呵,是这样吗? 仔细想想,又不对. 有些人,庸碌一生.满头白发后,再唏嘘的向后人

写给急功过利的百度:从此放弃百度空间

从n年前,以为百度是咱们民族互联网行业的象征之一,赚了很多钱,但不以赚钱为目的,在赚到钱的同时,会向中国广大的IT提供一些免费而稳定的辅助服务. 后来,百度推出的每项公众服务我都有关注到,如:百度空间,百度问答,百度贴吧,百度影音,电子商务站,云盘等等.有多少次都是风声大,雨点小,最后在自己小小的生态圈里折腾来折腾去.只要不赚钱就会很快萎缩或关闭,要不就是安全不顾忌用户体验,强行作大改,改到一半不了了之. 我从2008年初把自己的一些文字写到了当时新开不久的百度空间里,当时觉得:第一,她是免费的

再见-百度空间

头一段时间就知道百度空间要关闭了,但是还能打开,现在已经真的不能用了!陪伴了我四年的百度空间也总算是走到了尽头,有伤感,有惆怅,有不舍,更有无奈! 还记得当时在上面更新ACM时的激情和疯狂,青春的脚印和奋斗气息在上面展现的淋漓尽致.还记得当时以题会友,结交了好多ACM爱好者,时光荏苒,现在的自己早已被岁月磨平了棱角,一些年少轻狂的豪情壮志只能随着百度空间一样深深的埋在心里了! 再见,百度空间! 再见,年少轻狂的自己! 再见,青春!

Android手机无法访问百度空间的解决办法

本文网址:http://www.cnblogs.com/tunnel213/p/4301165.html 现象: 百度“JavaScript函数高级”后找到一篇文章,百度空间的,无法查看: 配置: 三星I929, Android 4.0, UC浏览器 诊断过程: 1.使用UC浏览其他网页正常,说明网络.手机.浏览器均正常: 2.使用UC的“网络诊断”功能,显示访问网站失败!然而使用其它手机可查看该网页,说明不是网站的原因! 3.百度后,初步认猜测可能是hosts文件的导致的! 解决: 1.已经r