zoukankan      html  css  js  c++  java
  • 关于C++ 中POD类型的解析

    转自: http://liuqifly.spaces.live.com/blog/cns!216ae3a149106df9!221.entry

    (C++-98:1.8;5)给出的定义:
    将对象的各字节拷贝到一个字节数组中,然后再将它重新拷贝到原先的对象所占的存储区中,此时该对象应该具有它原来的值。
    《imperfect c++》一书中给出的定义和一些特性利用:
    1、所有标量类型、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版
       本都是POD类型。
    2、POD结构/联合类型:一个聚合体(包括class),它的非static成员都不是pointer to member、
       pointer to member function、非POD结构、非POD联合,以及这些类型的数组、引用、const/
       volatile修饰的版本;并且,此聚合体不能有用户自定义constructor、destructor、assign
       operator。
    3、POD类型可以具有static成员、成员typedef、嵌套struct/class定义和成员函数/方法。
     
    POD类型特性:
    所有POD类型都可以作为union的成员,反之,所有非POD类型都不能作为union的成员。

    POD特性利用:
    我们可以利用POD类型特性来判断一个类型是否为POD类型:
    template struct must_be_pod
    {
        union
        {
            T noname;
        };
    };
    这个模板的意思是,只要类型T是非POD类型,那么编译器将报错,因为T被作为了union的一个成员。
    使用示例:
    template
    void func(const T& val)
    {
       //T is bound to by POD types,
       //Note: this occured at compile time
       must_be_pod();
       //do something with val
       ....
    }

    ------------------------------------------------------------------------

    转自: http://www.vckbase.com/document/viewdoc/?id=1321

    偶尔在一些文字资料和 C++ 文档以及 Microsoft .NET 框架中看到术语“POD 类型”。这个术语是什么意思?

    Shelby Nagwitz

    你可以将 POD 类型看作是一种来自外太空的用绿色保护层包装的数据类型,POD 意为“Plain Old Data”(译者:如果一定要译成中文,那就叫“彻头彻尾的老数据”怎么样!)这就是 POD 类型的含义。其确切定义相当粗糙(参见 C++ ISO 标准),其基本意思是 POD 类型包含与 C 兼容的原始数据。例如,结构和整型是 POD 类型,但带有用户定义的构造函数或虚拟函数的类则不是。 POD 类型没有虚拟函数,基类,用户定义的构造函数,拷贝构造,赋值操作符或析构函数。
      为了将 POD 类型概念化,你可以通过拷贝其比特来拷贝它们。此外, POD 类型可以是非初始化的。例如:

    struct RECT r;                     // value undefined
    POINT *ppoints = new POINT[100];   // ditto
    CString s;                         // calls ctor ==> not POD

      非 POD 类型通常需要初始化,不论是调用缺省的构造函数(编译器提供的)还是自己写的构造函数。
      过去, POD 对于编写编译器或与C 兼容的 C++ 程序的人来说很重要。现在,POD 来到 .NET 的环境中。在托管 C++ 中,托管类型(包括 __value 和 __gc 两者)能包含嵌入的原生 POD 类型。 Figure 3 展示了例举说明代码。托管的 Circle 类能包含 POINT,但无法包含 CPoint 类。如果你尝试编译 pod.cpp 会报一个 C3633 错误:“Cannot define ''m_center'' as a member of managed ''Circle'' because of the presence of default constructor ''CPoint::CPoint'' on class ''CPoint''.”(译者:意思是由于类 CPoint 有缺省的构造函数‘CPoint::CPoint’,所以不能将‘m_center’定义为托管类‘Circle’的一个成员)
      .NET 限定嵌入的本地对象只能为 POD 类型的理由是这样做能安全地拷贝它们,不用担心调用构造函数,初始化虚表,或任何非 POD 类型需要的其它机制。

  • 相关阅读:
    14个顶级开发社区 [程序员]
    跟我一起学习VIM
    INTRODUCTION TO BIOINFORMATICS
    vim + ctags + taglist配置和使用
    使用Gitblit 在windows 上部署你的Git Server
    HMM基本原理及其实现(隐马尔科夫模型)
    Qt 所有版本官方下载地址
    如何在ubuntu中安装和配置TeX Live ,Texstudio
    PyCharm和Anaconda的区别与联系
    如何在 matlab 和 excel之间进行数据导入导出操作?
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/6795895.html
Copyright © 2011-2022 走看看