- 主题:3202年了,c++项目用哪个标准比较好
1. std::visit对于std::variant,比较 virtual function对于virtual base,要少一次函数指针跳转,而且,因为用到std::variant的地方基本都是模板了,所以如果在编译时就能判断std::variant里的类型,std::visit更快
2. 因为不需要统一的virtual base,增加删除新的interface非常方便,耦合度小
3. std::vector,之类的container里不需要再传指针,可以直接在container里连续内存储存
【 在 fanci 的大作中提到: 】
: std::variant 相比于虚基类如何提升了性能?
--
FROM 115.193.172.*
很多地方很难通过手撸的
打个比方
double f(double x) const noexcept
{
return x*x;
}
这个函数,在传统意义上,是一个运行时的东西,因为x是在运行时传入的。
但是,在实际用这个函数的时候,很多时候,如果x是一个hardcode的东西,或者数学常量,比如f(3.1415926), 那实际上,这个就是一个编译时的东西,但是如果没有constexpr这一系列的东西,哪怕用C的宏来代替,还是要多一步运行时的3.1415926*3.1415926的计算
更复杂的,比如
double average(const std::vector<double> a) const noexcept
这个妥妥是个运行时了吧,都是std::vector了,但是,在实际代码里average({1, 2, 3.5, 4}),现在std::vector有一系列的constexpr ctor,那这个函数也变成一个编译时计算了。
所以,现代c++,基本上就是针对编译器的一种语言,能在编译时做了的,都在编译时做
【 在 leslin 的大作中提到: 】
:
: 这些其实都是编译时间和编程时间的交易
: 所谓的高性能计算,其实应用范围很窄,很多地方手撸就可以
: ...................
--
FROM 115.193.172.*
【 在 ziqin 的大作中提到: 】
: 很多地方很难通过手撸的
: 打个比方
: double f(double x) const noexcept
: ...................
怎么说呢,你举的栗子,就个例来说,手撸都不难
求平方的那个,写个宏,常量编译器都是可以正常合并的,没有运行时开销
average的那个,也可以写个宏来处理常量
当然不容易做成个数不定的那种,需要手工写ave1, ave2, ... 等若干个
方便性上通用性上不如,但不是过不下去的那种
我个人观点,现在c++为了所谓的通用性,牺牲了太多的东西
很多场景下,弊大于利了
--
FROM 222.71.215.*
不是所谓的通用性,是数学上的完备性,C++各个版本,virtual和template是两个体系,但是很多东西是一边用一边暴露出来不完备的,所以才在补全。
就学数学的人来说,c++的代码还是比较优雅的,不像其他的语言,很多时候完全看不下去。如果仅仅是写一些业务逻辑,不要踩坑,那直接python,或者定个编码规则,统一写些常用的wrapper, 哪些能用哪些不能用规定清楚就可以了,但是这些是具体项目上的管理的事
【 在 leslin 的大作中提到: 】
:
: 怎么说呢,你举的栗子,就个例来说,手撸都不难
: 求平方的那个,写个宏,常量编译器都是可以正常合并的,没有运行时开销
: ...................
--
FROM 115.193.172.*
项目的生命周期大于2年且编译器会持续升级,为啥要纠结11、17或者20呢?
如果对外发布且属于一锤子买卖,另说
【 在 leslin 的大作中提到: 】
: 98/03太考古,即使不用模板,没有auto, lambda 也不太舒服,肯定不用了
: 20 比较新,工具支持还不完美,这个坑最好还是不踩
: 那比较保守的11/14 和改动比较大的 17 之间,选择哪个好呢?
: ...................
--
FROM 114.84.0.*
【 在 leslin 的大作中提到: 】
:
: 编译快就是很大的福利啊
: 如果将来能够进化到像现代语言那样,不需要头文件和cpp分离
你说的这个.h和cpp分离应该是人为的,只是一种风格,完全可以把生命和定义写在同一个文件里面嘛。python的import在某种意义上也是在引入一个“头文件”,只不过python不需要提前声明直接写定义即可。
: ...................
--
FROM 202.141.160.*
能用新的就用新的(当然,要用稳定的新版),这是这几天在翻json序列化的代码时进一步加强的感受
C++委员会逐步搞的那些东西,就是让语言更好用(包括让写库的guru码农、写应用的普通码农也更好用),少搞一些奇技淫巧来绕过编译器的限制。当然他们定标准的速度更快一些那就更好啦
举例子:
1、VC6时代没有变参宏,弄一个通用的日志函数还要拼接,现在直接一个__VA_ARGS__搞定。
2、以前模板里要用decltype, sizeof来做各种参数类型约束的判定,现在直接concept搞定。
【 在 hgoldfish 的大作中提到: 】
: c++11 吧。新的标准也没啥用。
:
--
FROM 123.118.191.*
直接看懵逼了,variant代替基类指针是什么操作
【 在 ziqin 的大作中提到: 】
: 不写模板和高性能计算,20的确用处不大
: 一旦涉及高性能计算,必须constexpr, 必须literal,必须[[likely]], [[unlikely]], 必须能compile time的就compile time,必须std::variant来代替基类指针, 必须varidic template, 写trait必须folding expression,另外23里加了flat_map和flat_hash_map也是必用。
: 简直不能更多
: ...................
--
FROM 111.207.199.*
指的是这个,和使用基类指针各有千秋,按场合来。
https://stackoverflow.com/questions/59784261/stdvariant-vs-pointer-to-base-class-for-heterogeneous-containers-in-c
https://www.cppstories.com/2020/04/variant-virtual-polymorphism.html/
std::variant是静态dispatch,但需要提前知道所有可能的类型。
基类指针是virtual dispatch,性能比上面的差点,但不需要提前知道所有可能的类型。
【 在 CRonaldo31 的大作中提到: 】
: 直接看懵逼了,variant代替基类指针是什么操作
--
修改:z16166 FROM 123.118.191.*
FROM 123.118.191.*
自动azure互联网化以后,吸收了linux的优点,c++进度突然变快了
现在最新的趋势都彻底淘汰active那套,用powershell这种通用api接口了
【 在 leslin 的大作中提到: 】
:
: 以往的经验是vc的进度稍微慢一些。现在反而更快了?
--
FROM 122.224.174.*