Re: [问卦] C++20 也太机车了吧?

楼主: arrenwu (键盘的战鬼)   2021-02-20 17:14:58
※ 引述《HankYang (黄金神掌)》之铭言:
: 如题
: 就是我啦!
: 最近无聊去看C++20的新特性
: 靠北呀
: #include感觉要被淘汰惹
: 要改成类似python或javascript的module
: 变成import跟export
: 然后新的range library
: 靠背怎么那么像js
: C++是不是要变成妖魔鬼怪了
: 有没有八卦
刚刚随便Google了一下,这边有篇文章讲到Module的优点
https://www.modernescpp.com/index.php/cpp20-modules
考虑下面这个写在 helloWorld.cpp 里面的简单程式
// helloWorld.cpp
#include <iostream>
int main() {
std::cout << "Hello World" << std::endl;
}
本来.cpp档案大小 100,compile完变成executable是 12928
https://www.modernescpp.com/images/blog/Cpp20/Cpp20Modules/helloWorld.png
但在变成executable前,中间有一个 preprocessing,
也就是把那些 #include and #define的东西全部换成对应的文字。
https://www.modernescpp.com/images/blog/Cpp20/Cpp20Modules/preprocessor.png
这中间有个转换出来的程序,档案大小是 659471
而你如果把上面那个 HelloWorld 拆成几个档案
// hello.cpp
#include "hello.h"
void hello() {
std::cout << "hello ";
}
// hello.h
#include <iostream>
void hello();
// world.cpp
#include "world.h"
void world() {
std::cout << "world";
}
// world.h
#include <iostream>
void world();
// helloWorld2.cpp
#include <iostream>
#include "hello.h"
#include "world.h"
int main() {
hello();
world();
std::cout << std::endl;
}
在你 compile helloWorld2.cpp 的过程中, <istream>会被include 3次
https://www.modernescpp.com/images/blog/Cpp20/Cpp20Modules/helloWorld2.png
https://i.imgur.com/TJe4T5N.png
但他说如果是Module(import)那就只会import 1次
(奇怪 我还以为 #ifndef #endif 就是为了要避免这种事情发生)
照这文章的说法是这样compilation time可以减少
另外一个好处是 Module 容易避免撞到同样的 symbols。
像这下面这种情况,你include 的顺序会影响 RED 的数值
// webcolors.h
#define RED 0xFF0000
// productinfo.h
#define RED 0
作者: cuteSquirrel (松鼠)   2021-02-20 17:16:00
教授: C/C++助教就是你了。
作者: wahaha99 (此方不可长)   2021-02-20 17:17:00
这是语言定义问题还是Compiler的问题!?
作者: loadingN (sarsaparilla)   2021-02-20 17:18:00
我不知道 反正compiler小精灵帮我做了
作者: wonder007 ( )   2021-02-20 17:18:00
#ifndef 都变成常识了,C++20才想到要处理= =
作者: r5e97nk63 (DoUNo)   2021-02-20 17:28:00
所以是在说原本C的head file没做这些处理ㄇ
作者: wonder007 ( )   2021-02-20 17:29:00
没啊 谁规定要做这些处理,不处理有不处理的玩法啊
作者: nimura14 (阵内家的孩子)   2021-02-20 17:29:00
我也以为 header guards preprocessor variable 就会挡耶,不是。header guard 有档阿,三个档案预处理完大小差不多阿。
作者: wahaha99 (此方不可长)   2021-02-20 17:34:00
我的意思是说 会造成 include 三次 是语言如此定义还是Compiler没有去处理?
作者: nimura14 (阵内家的孩子)   2021-02-20 17:35:00
hello.cpp 和 world.cpp 各 include iostream 一次helloworld.cpp include iostream 三次,但他们大家相当所以代表 preprocessor 在预处理 helloworld.cpp 时,header guard 有起到作用吧?! *大小相当
作者: tkucuh (tku's cuh)   2021-02-20 17:37:00
重复symbols会被同事打死
作者: KILLE (啃)   2021-02-20 17:39:00
楼上 有人用人家库 不小心就撞到些常用名 像PACKET_SIZE
作者: nimura14 (阵内家的孩子)   2021-02-20 17:40:00
我看 C++ primer 上有建议,symbol 最好订在 class 中,
作者: tkucuh (tku's cuh)   2021-02-20 17:41:00
第三方在GLOBAL或define很少用这么短的吧...
作者: nimura14 (阵内家的孩子)   2021-02-20 17:41:00
让 class scope 隔开,避免冲突。
作者: KILLE (啃)   2021-02-20 17:41:00
这边讲的第三方是指在网络上黏贴人家代码
作者: AncientLich (低能的宅宅)   2021-02-20 17:42:00
其实C/C++都有方法解决这问题 只是一直没放到内建
作者: tkucuh (tku's cuh)   2021-02-20 17:42:00
那被打死不是应该吗?XDDDD
作者: nimura14 (阵内家的孩子)   2021-02-20 17:42:00
我也不知道 iostream 多大 (汗..),但肯定不小吧!
作者: hizuki (ayaka)   2021-02-20 17:43:00
define a const value要换成vonst expr才是现代用法
作者: nimura14 (阵内家的孩子)   2021-02-20 17:43:00
istream 和 ostream 这两个 class 不知道包了多少神奇多载运算子功能在里面。

Links booklink

Contact Us: admin [ a t ] ucptt.com