c++ 复合式 struct 邮箱格式怎么写写?也就是 一个struct 内涵一个struct

c++ struct与class的差别_ORC File 通译_PCI装置内存操作函数总结__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
c++ struct与class的差别
ORC File 通译
PCI装置内存操作函数总结
c++ struct与class的差别
c++ struct与class的区别从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:
  (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
  (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
  除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。
  不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:
  (1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
  (2)都可以有一大堆public/private/protected修饰符在里边;
  (3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
  (4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。
  (5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
  (6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。
  ---------------------------------------------------------------
  最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
  如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同!简单的说就是,存取class的data member和非virtual function效率和struct完全相同!不管该data member是定义在基类还是派生类的。
  如果不是为了和C兼容,C++中就不会有struct关键字。因此建议是:如果不需要与C兼容或传递参数给C程序,不要在C++中用struct。
  注意class的data member在内存中的布局可不一定是data member的申明次序。C++只保证处于同一个access section的data member按照申明次序排列。
  struct所体现的是一种数据结构,而class则是体现OOP思想中的"封装"的特性~~~
  还有一个区别:struct可以用{}赋初值,而class不行
  比如声明如下:
  struct abc{ int m1; float m2; bool m3; }
  可以这么构造对象:
  abc abcInstance{ 1, 1.0f, false };
  struct:属性
 class:属性+行为
  注意:在VC6里,class可以与模板关键字typename互换,但是struct好像就不可以,编译好像通不过。对这个问题,我专门查了一些资料,发现网上确实有说 struct不能用于模板关键字而class可以,这似乎应该是他们的一个不同了。然而,我又看了一下 《深度探索C++对象模型》,在书的前几章(好像就是第一章)Lippman说:本来他的编译器是不支持将struct作为模板关键字的,但后来改变了,也就是说struct 和class除了默认的访问属性外,其他场合下真正的完全一样了。对此,我认为这个按理说是这样的,但不同的编译器可能会有自己的处理,就像VC6那样。
  class中有方法,
  struct中没有.
  class是一个扩展的struct
  array(类型一样)-&struct(类型可以不一致)-&class(添加方法)
  虽然两者都可以捆绑行为。
  但是,理解不一样。
  struct,就是对程序员全局可见的数据与方法。简化数据逻辑结构的设计。可以说是一种自定义的数据结构。
  而class,则是将数据与方法封装,即让行为与数据一致。则是一种编程方法。即客观世界在代码世界中的体现。体现的是一种编程思想。
  在C里面:struct不能包含函数,而class可以。
  在C++里面:都可以有函数,默认情况下struct中变量是public,而class中是private
  有一点不明白,class支持的继承和多态,struct也支持??
  class在赋值运算符右边出现需要有定义的拷贝构造函数,而struct是默认的位拷贝.
  但是一般从兼容C的角度考虑,struct里面只包含数据成员而不包含成员函数,这只是一个编程习惯问题。
ORC File 通译
ORC File 翻译
转帖翻译 /archives/1014
原文 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
  ORC File,它的全名是Optimized Row Columnar (ORC) file,其实就是对RCFile做了一些优化。据官方文档介绍,这种文件格式可以提供一种高效的方法来存储Hive数据。它的设计目标是来克服Hive其他格式的缺陷。运用ORC File可以提高Hive的读、写以及处理数据的性能。和RCFile格式相比,ORC File格式有以下优点:  (1)、每个task只输出单个文件,这样可以减少NameNode的负载;  (2)、支持各种复杂的数据类型,比如: datetime, decimal, 以及一些复杂类型(struct, list, map, and union);  (3)、在文件中存储了一些轻量级的索引数据;  (4)、基于数据类型的块模式压缩:a、integer类型的列用行程长度编码(run-length encoding);b、String类型的列用字典编码(dictionary encoding);  (5)、用多个互相独立的RecordReaders并行读相同的文件;  (6)、无需扫描markers就可以分割文件;  (7)、绑定读写所需要的内存;  (8)、metadata的存储是用 Protocol Buffers的,所以它支持添加和删除一些列。
二、ORC File文件结构
  ORC File包含一组组的行数据,称为stripes,除此之外,ORC File的file footer还包含一些额外的辅助信息。在ORC File文件的最后,有一个被称为postscript的区,它主要是用来存储压缩参数及压缩页脚的大小。在默认情况下,一个stripe的大小为250MB。大尺寸的stripes使得从HDFS读数据更高效。  在file footer里面包含了该ORC File文件中stripes的信息,每个stripe中有多少行,以及每列的数据类型。当然,它里面还包含了列级别的一些聚合的结果,比如:count, min, max, and sum。下图显示出可ORC File文件结构:
三、Stripe结构
  从上图我们可以看出,每个Stripe都包含index data、row data以及stripe footer。Stripe footer包含流位置的目录;Row data在表扫描的时候会用到。  Index data包含每列的最大和最小值以及每列所在的行。行索引里面提供了偏移量,它可以跳到正确的压缩块位置。具有相对频繁的行索引,使得在stripe中快速读取的过程中可以跳过很多行,尽管这个stripe的大小很大。在默认情况下,最大可以跳过10000行。拥有通过过滤谓词而跳过大量的行的能力,你可以在表的 secondary keys 进行排序,从而可以大幅减少执行时间。比如你的表的主分区是交易日期,那么你可以对次分区(state、zip code以及last name)进行排序。
四、Hive里面如何用ORCFile
  在建Hive表的时候我们就应该指定文件的存储格式。所以你可以在Hive QL语句里面指定用ORCFile这种文件格式,如下:
CREATE TABLE ... STORED AS ORC
ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
SET hive.default.fileformat=Orc
所有关于ORCFile的参数都是在Hive QL语句的TBLPROPERTIES字段里面出现,他们是:
high level compression (one of NONE, ZLIB, SNAPPY)
press.size
number of bytes in each compression chunk
orc.stripe.size
number of bytes in each stripe
orc.row.index.stride
number of rows between index entries (must be &= 1000)
orc.create.index
whether to create row indexes
下面的例子是建立一个没有启用压缩的ORCFile的表
create table Addresses (
name string,
street string,
city string,
state string,
) stored as orc tblproperties ("press"="NONE");
五、序列化和压缩
  对ORCFile文件中的列进行压缩是基于这列的数据类型是integer或者string。具体什么序列化我就不涉及了。。想深入了解的可以看看下面的英文:
Integer Column SerializationInteger columns are serialized in two streams.  1、present bit stream: is the value non-null?  2、data stream: a stream of integersInteger data is serialized in a way that takes advantage of the common distribution of numbers:  1、Integers are encoded using a variable-width encoding that has fewer bytes for small integers.  2、Repeated values are run-length encoded.  3、Values that differ by a constant in the range (-128 to 127) are run-length encoded.The variable-width encoding is based on Google’s protocol buffers and uses the high bit to represent whether this byte is not the last and the lower 7 bits to encode data. To encode negative numbers, a zigzag encoding is used where 0, -1, 1, -2, and 2 map into 0, 1, 2, 3, 4, and 5 respectively.
Each set of numbers is encoded this way:  1、If the first byte (b0) is negative:    -b0 variable-length integers follow.  2、If the first byte (b0) is positive:    it represents b0 + 3 repeated integers    the second byte (-128 to +127) is added between each repetition    1 variable-length integer.In run-length encoding, the first byte specifies run length and whether the values are literals or duplicates. Duplicates can step by -128 to +128. Run-length encoding uses protobuf style variable-length integers.
String Column Serialization
Serialization of string columns uses a dictionary to form unique column values The dictionary is sorted to speed up predicate filtering and improve compression ratios.
String columns are serialized in four streams.  1、present bit stream: is the value non-null?  2、dictionary data: the bytes for the strings  3、dictionary length: the length of each entry  4、row data: the row valuesBoth the dictionary length and the row values are run length encoded streams of integers.
PCI装置内存操作函数总结
PCI设备内存操作函数总结1.
ExAllocatePool()
函数说明:
ExAllocatePool allocates pool memory of the specified type and returns a pointer to the allocated
函数定义:
PVOID ExAllocatePool(
POOL_TYPE PoolType,
SIZE_T NumberOfBytes
代码中用来分配设备描述DMA adepter设备的特性(DEVICE_DESCRIPTION),作为参数传递给IoGetDmaAdapter()函数。在调用IoGetDmaAdapter()函数之前就要对PDEVICE_DESCRIPTION结构进行指定各种特性。
实际中这样使用:
PDEVICE_DESCRIPTION DeviceDescription = (PDEVICE_DESCRIPTION) ExAllocatePool
(PagedPool, sizeof(DEVICE_DESCRIPTION));
2. RtlZeroMemory()
函数说明:
The RtlZeroMemory routine fills a block of memory with zeros, given a pointer to the block and the length, in bytes, to be filled.
函数定义:
VOID RtlZeroMemory(
VOID UNALIGNED *Destination,
SIZE_T Length
3. IoGetDmaAdapter()
函数说明:
The IoGetDmaAdapter routine returns a pointer to the DMA adapter structure for a physical device object.
函数定义:
struct _DMA_ADAPTER* IoGetDmaAdapter(
PDEVICE_OBJECT PhysicalDeviceObject,
struct _DEVICE_DESCRIPTION *DeviceDescription,
PULONG NumberOfMapRegisters
实际代码中这样使用:
NumberOfMapRegisters=100;
pdx-&DmaAdapter=IoGetDmaAdapter(pdx-&NextStackDevice,DeviceDescription,&NumberOfMapRegisters);// NextStackDevice在AddDevice函数中已经attach了。
4. AllocateCommonBuffer()
函数说明:
The AllocateCommonBuffer routine allocates memory and maps it so that it is simultaneously accessible from both the processor and a device for DMA operations。
函数定义:
PVOID AllocateCommonBuffer(
PDMA_ADAPTER DmaAdapter,
ULONG Length,
PPHYSICAL_ADDRESS LogicalAddress,
BOOLEAN CacheEnabled
注:第一个参数是IoGetDmaAdapter()返回的,第三个参数是自己顶一顶一个物理地址类型,用来接收分配得到的物理地址首址。
返回值:返回值为虚拟地址,供上层使用
实际代码中这样使用:
pdx-&descAddress=pdx-&allocateCommonBuffer(pdx-&DmaAdapter,(ULONG)DESC_ADDRESS*PORT_NUM,&pdx-&DescLogicalAddress,FALSE);
附:使用该函数必不可少的会使用下面的函数
pdx-&DmaAdapter=IoGetDmaAdapter(pdx-&NextStackDevice,DeviceDescription,&NumberOfMapRegisters);
//创建一个DMA适配器
pdx-&allocateCommonBuffer=*pdx-&DmaAdapter-&DmaOperations-&AllocateCommonB
//分配连续的物理内存DMA函数
pdx-&freeCommonBuffer = *pdx-&DmaAdapter-&DmaOperations-&FreeCommonB
//释放连续的物理内存DMA函数
pdx-&putDmaAdapter=*pdx-&DmaAdapter-&DmaOperations-&PutDmaA
//释放DMA Adapter对象
当通过AllocateCommonBuffer()分配得到地址之后需要把这个地址分成两部分来处理,与硬件打交道的需要用LogicAddress 与 应用程序打交道需用 Virtual Address.
最好将AllocateCommonBuffer()函数取得的这两个地址保存到设备扩展中特定的变量中(根据内存块的用处),便于以后操作。可以这样做:
pdx-&RxDescVirBase=(PCHAR)pdx-&descA
pdx-&RxDescPhyBase=(ULONG)(pdx-&DescLogicalAddress.LowPart); //物理地址
WRITE_REGISTER_ULONG( (PULONG)&pdx-&pHBARegs-&RxAddr_des_0,pdx-&rx_fc_des
c_buf_phy[0]+16);
WRITE_REGISTER_ULONG( (PULONG)&pdx-&pHBARegs-&RxAddr_des_addr0_ptr,pdx-&r
x_fc_desc_buf_phy[0]+4);
注意前面的 +16 和 +4 实际分别代表美一块内存的的偏移位置,由于我们定义了这块内存的结构,并在里面布局,+16 其实代表了struct rx_fc_ctl_tab 结构中的 struct rx_fc_desc_entity entity[RX_FC_DESC_NUM] 域,这里又是一个结构,也就是我们最终会用到的“描述符”。注意:我们这里的操作是将一个地址写到一个寄存器,这个地址必须是物理地址,也就是前面说的LogicAddress。这里pHBARegs是通过pdx-&pHBARegs=(PHBA_REGS)pdx-&RegsB
获得的,也就是在CmResourceTypeMemory传过来时解析,代表硬件提供的DMA寄存器首址。
对于硬件的初始化就是通过WRITE_REGISTER_ULONG()函数来完成,针对设备的起始地址来进行偏移,自己定义结构来匹配各个寄存器的内容,注意这个自己定义的结构一定要严格跟硬件寄存器相同,一bit都不能差。
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:3395人阅读
&C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。
&&&&struct能包含成员函数吗?&&&能!
&&&&struct能继承吗?&&&&&&&&&&能!!
&&&&struct能实现多态吗?&&&&&&&能!!!
&&&&&最本质的一个区别就是默认的访问控制,体现在两个方面:
&&&&1)默认的继承访问权限。struct是public的,class是private的。
&&&&&&&写如下的代码:
&&&&struct A
&&&&struct B : A
&&&&这个时候B是public继承A的。如果都将上面的struct改成class,那么B是private继承A的。这就是默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:
&&&&struct B : public A
&&&&就是为了指明是public继承,而不是用默认的private继承。
&&&&当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:
&&&&struct A{};
&&&&class B : A{};&&&&//private继承
&&&&struct C : B{};&&//public继承
&&&&2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
&&&&3)“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
&&&&4) 还是上面所说的,C++中的struct是对C中的struct的扩充,既然是扩充,那么它就要兼容过去C中struct应有的所有特性。例如你可以这样写:
&&&&struct A&&&&//定义一个struct
&&&&&char c1;
&&&&&int&&n2;
&&&&&double db3;
&&&&A a={'p',7,3.1415926};&&//定义时直接赋值
&&&&也就是说struct可以在定义的时候用{}赋初值。
&&& 向上面的struct中加入一个构造函数(或虚函数),struct也不能用{}赋初值了。的确,以{}的方式来赋初值,只是用一个初始化列表来对数据进行按顺序的初始化,如上面如果写成A a={'p',7};则c1,n2被初始化,而db3没有。这样简单的copy操作,只能发生在简单的数据结构上,而不应该放在对象上。加入一个构造函数或是一个虚函数会使struct更体现出一种对象的特性,而使此{}操作不再有效。事实上,是因为加入这样的函数,使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。至于虚函数和普通成员函数有什么区别,我会具体写篇文章讨论。
&&&&那么,看到这里,我们发现即使是struct想用{}来赋初值,它也必须满足很多的约束条件,这些条件实际上就是让struct更体现出一种数据机构而不是类的特性。那为什么我们在上面仅仅将struct改成class,{}就不能用了呢?其实问题恰巧是我们之前所讲的——访问控制!你看看,我们忘记了什么?对,将struct改成class的时候,访问控制由public变为private了,那当然就不能用{}来赋初值了。加上一个public,你会发现,class也是能用{}的,和struct毫无区别!!!
&&从上面的区别,我们可以看出,struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。
关于使用大括号初始化
  class和struct如果定义了构造函数的话,都不能用大括号进行初始化
  如果没有定义构造函数,struct可以用大括号初始化。
  如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。
关于默认访问权限
  class中默认的成员访问权限是private的,而struct中则是public的。
关于继承方式
  class继承默认是private继承,而struct继承默认是public继承。
  且看如下代码(看看编译器给出的错误信息):
  void f()
   cout&&&T1::f()&&&
 int x,y;
 void f(){cout&&&T2::f()&&&}
struct TT1 : T1
class TT2 : T2
int main()
  在模版中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。
template &struct X&
void f(X x)
//出错信息:d:codecpptestcpptestcpptest.cpp(33) : error C2065: 'X' : undeclared identifier
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:389662次
积分:5875
积分:5875
排名:第1550名
原创:175篇
转载:72篇
评论:197条
(5)(4)(2)(3)(8)(12)(7)(23)(3)(8)(7)(21)(6)(10)(40)(19)(3)(12)(17)(1)(1)(13)(4)(10)(2)(6)(1)(1)c++判断俩个矩形的是否相交对吗?#includtypedef struct Rect{ //左上角x坐标 //左上角Y坐标 //矩形的高 //矩形的宽}RECT;bool FUN(RECT rcSour,RECT rcDest) { bool b_Result= // 如果第一个矩形的左边x_百度作业帮
c++判断俩个矩形的是否相交对吗?#includetypedef struct Rect{ //左上角x坐标 //左上角Y坐标 //矩形的高 //矩形的宽}RECT;bool FUN(RECT rcSour,RECT rcDest) { bool b_Result= // 如果第一个矩形的左边x坐标大于第二个矩形右边的x坐标,肯定不相交if(rcSour.x>(rcDest.x + rcDest.w) && (rcSour.x + rcSour.w)>rcDest.x)b_Result=// 如果第一个矩形的右边x坐标小于第二个矩形左边的x坐标,肯定不相交if(rcSour.xrcDest.y)b_Result= // 如果第一个矩形的顶边y坐标小于第二个矩形底边的y坐标,肯定不相交if(rcSour.y
应该不对,回字形状处理了么,这个不能算相交吧C++中的struct专题研究 - 中国蓝客联盟
C++中的struct专题研究
&&&   C++之父Bjarn Stroustrup对C++语言概括的第一条就是"a better C"。strUCt这个关键字就来源于C。而在C++中,struct的含义已经和C中的struct不尽相同了。在C++中,用户定义类型,也就是class,拥有和内建类型一样的地位。这可以从C++中struct定义的类型在声明变量时不必再写出struct关键字看出。如
&&&   struct Foo {
&&&   // ...
&&&   };
&&&   在C++程序中,人们似乎更热衷于使用class,而几乎忽略了struct的存在。实际上,struct就是成员默认为public的class(在class中,成员默认为private)。事实上以下两端代码完全等价:
&&&   代码一:
&&&   struct Foo {
&&&   // ...
&&&   };
&&&   代码二:
&&&   class Foo {
&&&   public:
&&&   // ...
&&&   };
&&&   那么为什么要有struct的存在呢?首先的原因自然是保持对C的兼容。原先的C代码可以不必修改就成为合法的C++代码。第二个原因(个人愚见),是为了让struct来表示抽象的数据类型以及抽象接口,而与class所表示的类的概念相区别。
&&&   struct在C中的使用方式转移到C++以后仍然是非常重要,作为一组相关的数据而存在于一个struct,说明了他们在逻辑上是相互关联的数据,同时他们被保存在struct里而不是全局变量,也是对数据的一种管理。个人认为一种很朴素的用法要取代当前很热门的get-set用法。比如
&&&   class Foo {
&&&    
&&&   public:
&&&    int get_bar() { }
&&&    void set_bar(const int& b) { bar = }
&&&   };
&&&   这里Foo::bar是一个需要频繁存取的数据对象,它作为类Foo的私有成员存在,而通过公共接口存取。这是面向对象思想中数据封装的体现。而考虑一下这个Foo::bar是否有必要成为私有成员?没有,因为它就是一个数据,没有必要用私有类成员的思想来封装它,似乎可以看成是面向对象思想的过度滥用。等效的可以写成:
&&&   struct Foo {
&&&    
&&&   };
&&&   然后通过普通的赋值操作来完成。这样做似乎是回到了原始时代,但没有必要用的就不要用,否则还会影响效率。 其次一个struct的应用就是来描述纯虚类,也就是后来Java语言中类似接口的东西:
&&&   struct Foo {
&&&    virtual void Bar1() = 0;
&&&    virtual void Bar2() = 0;
&&&    // ...
&&&   };
&&&   使用struct可以些许节省编译器的语法分析时间:),而且能在语义上表达的更为清楚。
&&&   一般来讲,当一个类中有必要进行数据隐藏时,请用class声明,并将私有数据标记为private,公共接口标记为public;而当所有成员都有必要成为公有成员的时候,请用struct来声明它。c++ 复合式 struct 怎么写?也就是 一个struct 内涵一个struct_百度知道
c++ 复合式 struct 怎么写?也就是 一个struct 内涵一个struct
这种复合式的struct该怎么写才是正确的呢,有道题是要求struct 内置struct,第一个是一个人的id号码,在网上搜了很久都没有搜到类似答案,第二个是一个struct里面有三个member,题目是说是有一个struct 里面有两个members,分别是他的名和姓?本人属于是新手
B bstruct A{struct A{ 或者 struct B{
char c[10]; };
char d[10];
char c[10];
char d[10]; };}
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 邮箱格式怎么写 的文章

 

随机推荐