关于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 类型”。这个术语是什么意思?
你可以将
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 类型需要的其它机制。
关于C++ 中POD类型的解析的更多相关文章
- Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值
感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...
- Oracle中Clob类型处理解析
最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的 ...
- Oracle中Clob类型处理解析 (转)
转:原文:http://blog.csdn.net/pojianbing/article/details/2789426 最近利用NHibernate映射类型为Clob字段在插入数据时发现当 ...
- 游戏开发中IIS常见支持MIME类型文件解析
游戏开发中IIS常见支持MIME类型文件解析 .apkapplication/vnd.android .ipaapplication/vnd.iphone .csbapplication/octet- ...
- 关于POD和非POD类型中,list initialization和constructor initialization(未解决)
如果你的成员是POD类型的,那么list initialization和constructor initialization没有任何区别 #include<iostream> using ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- OS中atomic的实现解析
OS中atomic的实现解析 转自:http://my.oschina.net/majiage/blog/267409 摘要 atomic属性线程安全,会增加一定开销,但有些时候必须自定义ato ...
- 【翻译自nikic大神】PHP中原生类型的方法
引言 第一次,翻译别人的文章,用四级英语的水平来翻译~~囧,可能有很多不太恰当的地方,尽管拍砖(有些地方实在想不到恰当的翻译,我同时贴出了原文和自己很low的翻译). 翻译这篇文章用了我3个晚上一个中 ...
- 拼接json时小心C#中bool类型转化
C#中bool类型的值,在ToString时会有如下转化:true—>Ture ; false—>False这是拼接到json串中就会出现如下结果:{ "no": &q ...
随机推荐
- Highmaps网页图表教程之图表配置项结构与商业授权
Highmaps网页图表教程之图表配置项结构与商业授权 Highmaps图表配置项结构 Highmaps最核心的部分就是图表配置项.用户通过图表配置项来对标题进行定制,从而实现自己所要的效果.所以,掌 ...
- python orm字段解析
null # 是否可以为空 default # 默认值 primary_key # 主键 db_column # 列名 db_index # 索引(db_index=True) unique # 唯一 ...
- ?P<username>\w+
- Django Template Language 模板语言
一.标签 tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例 {# 取variable中的第一个参数 #} {{ variab ...
- 【CF 585E】 E. Present for Vitalik the Philatelist
E. Present for Vitalik the Philatelist time limit per test 5 seconds memory limit per test 256 megab ...
- session过期情况下ajax请求不会触发重新登录的问题
在拦截器中添加以下逻辑 String requestType = request.getHeader("X-Requested-With"); if (!StringUtils.i ...
- Alpha7
难受
- 趁热打铁学node
前言 不废话直接官网下载安装. windows安装很简单,双击ok. 完成后命令行输入node -v. 会提示版本号,说明安装成功(Node.js 还自动附带安装了 npm,类似ruby的gem). ...
- 腾讯的网站是如何检测到你的 QQ 已经登录?
在 QQ 已经登录的情况下,手动输入网址打开 QQ 邮箱 或者 QQ 空间 等腾讯网站,可以看到网页已经检测到本地 QQ 客户端已经登录,于是用户可以很方便地一键登录网站而不必再输入用户名密码. 这实 ...
- Git_使用GitHub
我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...