(Translated by https://www.hiragana.jp/)
POD (程序设计) - 维基百科,自由的百科全书

POD (ほどじょ设计)

Plain old data structure, 缩写为POD, C++语言てき标准ちゅうてい义的いちかずすえ结构[1],POD适用于需ようあかり确的すうすえそこ操作そうさてきけい统中。POD通常つうじょうようざいけいてき边界处,そくゆび不同ふどうけい统之间只のう以底层数すえてき形式けいしき进行交互こうごけい统的だか层逻辑不能ふのう互相けんよう如当对象てきだん从外部数ぶすうすえちゅう构建时,けい统还ぼつゆう办法对对ぞう进行语义检查和解わかい释,这时就适ようPODらいそん储数すえ

てい

编辑

POD类型包括ほうかつじゅつC++类型,以及其cv-qualifiedてき类型,还有以其为基类型てきすう组类がた[2]:

  • 标量类型(scalar type)
  • POD类类がた(POD class type)

しるべりょう類型るいけい

编辑

術語じゅつごしるべりょう類型るいけい包括ほうかつじゅつC++類型るいけい範疇はんちゅう, 以及其cv-qualified類型るいけい[3]:

  • さん术类がた(arithmetic type)
  • まい举类がた(enumeration type)
  • ゆび针类がた(pointer type)
  • 指標しひょういた成員せいいん類型るいけい(pointer-to-member type)

术语さん术类がた包括ほうかつじゅつC++类型范畴[4]:

  • 整数せいすう类型(integral type)
  • 浮点类型(floating type)

术语整数せいすう类型包括ほうかつじゅつC++类型范畴[5]:

  • ゆう符号ふごう整数せいすう类型 (signed char, short, int, long),
  • 无符ごう整数せいすう类型(unsigned char, unsigned short, unsigned int, unsigned long),
  • もと類型るいけいcharあずかひろしもと類型るいけいwchar_t
  • ぬのりん類型るいけいbool。

术语浮点类型包括ほうかつC++てきfloat, double, and long double类型[4].

术语まい举类がた包括ほうかつかく种枚举类がたそく命名めいめいてきつねりょう值(named constant values)てき集合しゅうごう[6].

術語じゅつご指標しひょう類型るいけい包括ほうかつじゅつC++類型るいけい範疇はんちゅう[7]:

  • そら指標しひょうpointer-to-void (void *),
  • 對象たいしょう指標しひょうpointer-to-objectあずか指向しこう靜態せいたいすうよりどころ成員せいいんてき指標しひょうpointer-to-static-member-data (がた如為T*,其中T對象たいしょう類型るいけい),
  • 函數かんすう指標しひょうpointer-to-functionあずか指向しこう靜態せいたい成員せいいん函數かんすうてき指標しひょうpointer-to-static-member-function (がた如T (*)(...),T函數かんすうてきかえしかい值的類型るいけい).

術語じゅつご指標しひょういた成員せいいん類型るいけい包括ほうかつじゅつC++類型るいけい範疇はんちゅう[7]:

  • 指標しひょういた靜態せいたいすうよりどころ成員せいいん(pointer-to-nonstatic-member-data), かたち如T C::* 表示ひょうじ指向しこうるいCてき類型るいけいためTてきすうよりどころ成員せいいんてき指標しひょう
  • 指標しひょういた靜態せいたい成員せいいん函數かんすう(pointer-to-nonstatic-member-functions), かたち如T (C::*)(...) 表示ひょうじ指向しこうるいCてきかえしかい值類がたためTてき成員せいいん函數かんすうてき指標しひょう.

POD类类がた

编辑

POD类类がたゆび聚合类(aggregate classes, そくPOD-struct types)あずか聚合union (POD-union types),且不具有ぐゆうじゅつなり[8]:

  • ゆび针到なり员类がたてきせい态数すえなり员(包括ほうかつすう组)。
  • POD类类がたてきせい态数すえなり员(包括ほうかつすう组)。
  • 引用いんよう类型てき(reference type)せい态数すえなり员。
  • よう户定义的拷贝与赋值さん
  • よう户定义的析构函数かんすう

术语聚合ゆびにんなんてきすう组或しゃ类,且不具有ぐゆうじゅつとくせい[9]:

  • よう户定义的构造函数かんすう
  • 私有しゆうある护的せい态数すえなり员。
  • もと类。
  • きょ函数かんすう

见,POD类类がた就是ゆびclass、struct、union,且不具有ぐゆうよう户定义的构造函数かんすう、析构函数かんすう、拷贝さん、赋值さん具有ぐゆう继承关系,いん此没ゆうもと类;具有ぐゆうきょ函数かんすう所以ゆえん就没ゆうきょひょうせい态数すえなり员没ゆう私有しゆうある护属せいてきぼつゆう引用いんよう类型てきぼつゆうPOD类类がたてきそくはま套类必须POD)、ぼつゆうゆび针到なり员类がたてきいん为这个类がた内含ないがんりょうthisゆび针)。

C++11じょう况推广为两种:

类型平凡へいぼんてき(trivial),则可以静态初はじめ以用memcpy直接ちょくせつ复制すうすえ而不必须ようcopy构造函数かんすう。其生存せいぞんはじめ于它てき对象てきそん储被てい义,无须とういた构造函数かんすう完成かんせい平凡へいぼんclassある结构必须满足:

  • ゆう平凡へいぼんてきかけしょう构造函数かんすう可用かよう这样てきだま认语ほう:(SomeConstructor() = default;)
  • ゆう平凡へいぼんてきcopyあずかmove构造函数かんすう可用かようだま认语ほう.
  • ゆう平凡へいぼんてきcopyあずかmove运算可用かようだま认语ほう.
  • ゆう平凡へいぼんてきdestructor,不能ふのうきょ函数かんすう.

构造函数かんすう平凡へいぼんてき,仅当类没ゆうきょなり员函数也かずやぼつゆうきょもと类。Copy/move运算平凡へいぼんてき,仅当ぼつゆうせい态数すえなり员。

类型标准ぬのきょくてき(standard-layout)意味いみ它是ゆうじょてき并且やすはい其成员兼よう于C语言。这要求ようきゅう满足:

  • ぼつゆうきょ函数かんすう
  • ぼつゆうきょもと
  • 所有しょゆうせい态数すえなり员有しょうどうてき访问ひかえせい(public, private, protected)
  • 所有しょゆうせい态数すえなり员,包括ほうかつ在任ざいにんなん类中てき存在そんざい于类继承体系たいけいちゅうてきいち个类ちゅう
  • 上述じょうじゅつ规则适用于所有しょゆうもと类与类继承体系たいけいちゅうてき所有しょゆうせい态数すえなり
  • ぼつゆうどう一类型的基类型被定义为第一个非静态数据成员

いち个class/struct/unionPOD,とう它是平凡へいぼんてき、标准ぬのきょくてき所有しょゆうすうすえなり员是POD.

ぶん为两个概念がいねん,对象以不满足其中一个但是满足另外一个。れい如,类有复杂てきmoveあずかcopy构造函数かんすういん此不平凡へいぼんてきただし可能かのう标准ぬのきょくいん此能あずかCほどじょ操作そうさ。类似いち个类てきゆうpublicあずかprivateてきせい态数すえなり员,いん此不标准ぬのきょくただし以是平凡へいぼんてきいん此可以memcpy操作そうさ

用途ようと

编辑

POD类型ざいみなもとだい码兼よう于ANSI C时非常ひじょう重要じゅうよう。POD对象あずかC语言てき对应对象具有ぐゆう共同きょうどうてきいち些特せい包括ほうかつはつはじめ、复制、うちそんぬのきょく、寻址。

一个例子是下述C++てきnewひょう达式ちゅうてき对象はつはじめ,PODあずかnon-PODてき[10]:

おもて达式 POD类型T non-POD类型T
new T はつはじめ かけしょうはつはじめ
new T() 总是かけしょうはつはじめ
new T(x) 总是调用构造函数かんすうはつはじめ

いん此,non-POD类型てき对象あるすう组总はつはじめ;而POD类型てき对象あるすう可能かのうはつはじめ.

其它与PODしょう关的C++特性とくせい:

  • うちそんぬのきょく——POD对象てき组成节是连续てき[11].

"POD-struct ... types are layout-compatible if they have the same number of members, and corresponding members (in order) have layout-compatible types"[12].

POD-union ... types are layout-compatible if they have the same number of members, and corresponding members (in any order) have layout-compatible types"[13].

  • はつはじめ——对于non-const POD对象,如果ぼつゆうはつはじめ声明せいめい时,具有ぐゆう确定てきはつ值(indeterminate initial value) [14]. POD对象てきかけしょうはつはじめ为0值[15]. せい态POD对象はつはじめ为给じょうてきはつ值,如果局部きょくぶせい态POD对象,ざい进入所在しょざい作用さよういきぜんはつはじめ[16][§6.7, ¶4]; 对于局部きょくぶせい态POD对象,在任ざいにんなん动态はつはじめぜん赋予はつ[17].
  • 拷贝——POD对象直接ちょくせつ拷贝(れい如用memcpy())いた其它すう组或しょうどうPOD类型てき对象,保持ほじ其值[18]。POD类型以用さく标准ばんくし类的[19]. よし于这个原因げんいん函数かんすうてきかえしかい值如はてnon-POD类型,则不能ふのうどおり过寄そん传递函数かんすうてきかえしかい值。
  • 寻址——いち个POD对象てき以是一个地址常量表达式[20]いち个对PODなり员的引用いんよう以是一个引用常量表达式[21]. いち个POD-struct对象てきゆび针,适合ようreinterpret_cast转换到它的はつはじめ[22].

POD JAVA

编辑

JAVAちゅう,一些开发者认为POD类型符合ふごうぼつゆうpublicなり员且ぼつゆう方法ほうほうてき类,如data transfer object。其实使用しよう事件じけん句柄くがら并且实现じょgettersetter外的がいてき附加ふか方法ほうほうてきPOJO(ただ含有がんゆうgettersetterてき类)かずJAVA Bean也属于POD。ただしかん怎么样,POJOJAVA Beanやめ经有りょうふうそうやめ经违はんりょうPODてきてい义了。

まいり

编辑

Visual C++名字みょうじおさむ

参考さんこう文献ぶんけん

编辑
  1. ^ ISO/IEC 14882, first edition, 1998-09-01 p. 5, footnote 4]
  2. ^ まいり见C++标准てき§3.9, ¶10; §9, ¶4
  3. ^ まいりC++標準ひょうじゅん§3.9, ¶10
  4. ^ 4.0 4.1 まいり见C++标准§3.9.1, ¶8
  5. ^ まいり见C++标准§3.9.1, ¶7
  6. ^ まいり见C++标准§3.9.1, ¶1; §7.2, ¶1
  7. ^ 7.0 7.1 まいりC++標準ひょうじゅん§3.9.2, ¶1
  8. ^ まいり见C++标准§9, ¶4
  9. ^ まいり见C++标准§8.5.1, ¶1
  10. ^ まいり见C++标准§5.3.4, ¶15
  11. ^ まいり见C++标准§1.8, ¶5
  12. ^ まいり见C++标准§9.2, ¶14
  13. ^ まいり见C++标准§9.2, ¶15
  14. ^ まいり见C++标准§8.5, ¶9
  15. ^ まいり见C++标准§8.5, ¶5
  16. ^ まいり见C++标准§6.7, ¶4
  17. ^ まいり见C++标准§3.6.2, ¶1
  18. ^ まいり见C++标准§3.9, ¶2あずか3
  19. ^ まいり见C++标准§21, ¶1
  20. ^ まいり见C++标准§5.19, ¶4
  21. ^ まいり见C++标准§5.19, ¶5
  22. ^ まいり见C++标准§9.2, ¶17