百科问答小站 logo
百科问答小站 font logo



在c++代码中使用const关键字是不是自找麻烦? 第1页

  

user avatar   haozhi-yang-41 网友的相关建议: 
      

首先,非常明确,std::vector<const Obj*> 和std::vector<Obj*>是两个不同类型,而且没有隐式的cast。更进一步,即使你愿意自己写代码cast,严格来说,考虑到可能存在特化,它们之间还不存在一定安全的复杂度为O(1)的cast(非O(1)的我想你也不乐意用)。

所以,需要考虑的是为什么要把std::vector<Obj*>当作std::vector<const Obj*>类型的参数?如果你仅仅是觉得func里面的实际操作,只需要const Obj*,那你应该单独为这部分操作独立定义一个函数:

       void func_impl(const Obj*);      

然后在各自的调用地方执行vector相关的操作。


如果你觉得外部的vector相关的操作也很通用,那么可以加一个模板形式的wrapper:

       template <typename T> void func(const std::vector<T*>&);      

然后通过这个func再调用上面的那个func_impl。


当然,如果以后不局限于vector,把这个wrapper写得更通用一点也是可以的:

       template<typename T> void func(const T&);      


总之,代码结构设计并不是一个简单的const或者随手写一个func就完事的了,这是一个配套项目。你现在捶胸顿足,说明你已经认识到了你之前的代码结构设计不合理,但你的怨气都指向了const,说明你还没有真正意识到是哪里的设计不合理。


user avatar   xziar 网友的相关建议: 
      

问题不在const上,但这个的确算是C++设计时的瑕疵,但又不能说是bug……

而且我觉得也不好认为这是泛型协变/逆变的问题。


A<T*>A<const T*>一定有同样的实现吗?

不尽然,因为模板类可以特化,两者完全可以有截然不同的内存布局、成员函数,甚至功能……

所以从语法角度,不接受vector<Obj*>是合理的,除非你给出了operator vector<const Obj*>()


与之相似的情况还有,就算你的vector存的是const Obj*,如果你用了其他的allocator,也一样不被接受,因为Allocator也在模板参数列表里……

但显然,对于用户来说,vector本身已经是const,allocator是什么又有什么关系呢

不过对于这一问题,C++17靠pmr::vector来“规避”了——allocator都被固定成同一种了,具体类型成了擦除类型的成员变量。


回到你遇到的const问题。哪怕vector<const T*>vector<T*>之间不能互相转换吧,但本来你需要的只是“const的一堆连续的const T*”,而vector并不是必要条件。所以在C++20语境下会自然而然地联想到用std::span

然而span<const T*>并不能隐式通过vector<T*>来构造

不过幸好,你还能手动构造,虽然要显式做const_cast{const_cast<const T**>(v.data), v.size()}。非常不美观,但至少不需要reinterpret_cast那样的风险……


补充:应该用span<const T* const>,就能隐式构造了

看来这部分隐式转换的知识我还是不够懂……


只能说,多用const是一个好习惯,但C++的设计使得有时候它反而会成为阻碍……


user avatar   pansz 网友的相关建议: 
      

开局一张图,剩下全靠猜?这个没法评价。

从软件的角度虽然我能想出两三种导致这个现象的原因,但非正式发布的产品出现任何问题都是常见现象。盲人摸象的评价没有必要。

跟11代没差别,这个肯定是违背常识的,要知道11代i9只有16线程,12代i9有24线程,24线程超越16线程并不需要多么高超的优化技巧。

调度优化的主要难题是当我们只需要少量线程运作的时候究竟把这个线程安排在哪个核心。

然而,对于全核心全线程同时计算的场景来说,反正都是全核心上场,根本不需要什么优化,谁来都是全核心工作。

如果这个软件能把所有核心用满的话,没道理性能不变。所以肯定有某个环节出了问题。正式版本再说吧。


user avatar   ling-jian-94 网友的相关建议: 
      

这是我看到的最准确的总结。

总的来说,就是中国的高考相对公平,所以性价比极高,所以其他活动都可以适当让步。


user avatar   timothyqiu 网友的相关建议: 
      

哪吒不知道,说说孙悟空。

看过某个物理专业人士的测算,孙悟空带着金箍棒坐筋斗云撞击物体,金箍棒的质量加上筋斗云的速度,会引发一场相当于60枚大伊万这样的超级大氢弹的爆炸。

孙悟空用金箍棒朝敌人腰部横扫,敌人会被直接腰斩,并且伤口部位由于温度过高而碳化。

金箍棒如果能无限缩小,由于质量不变,可以活生生制造一个黑洞。

孙悟空可以举起两座山在天上飞,也就是大概能举起十万亿吨的东西。

孙悟空的肉体强度可以抵挡接近光速的粒子轰击。

如果孙悟空加入复联,也就没有其他人什么事了。灭霸来到地球,悟空坐着筋斗云撞击灭霸,灭霸直接原地蒸发。




  

相关话题

  如何从零写一个正则表达式引擎? 
  为什么C++在构造函数和析构函数中不能抛出异常? 
  为什么c/cpp语言的函数好像没有按照驼峰命名法呢? 
  大一学生,刚开始学习编程,但感觉自己并没有天赋怎么办? 
  c++中指针的作用是什么呢?单纯的用引用不可以吗? 
  如果有一个按钮按下,世界上所有的c,c++,c#语言代码都无效,我们的生活会发生什么? 
  为什么游戏引擎大多选择使用 C++ 而不是 C 开发? 
  如何评论"知名游戏开发者称 C++ 是一种非常糟糕、可怕的语言"? 
  C语言中,为什么指向指针的指针的类型是int **?类型的话直接int*不就行了? 
  Java 的开发效率究竟比 C++ 高在哪里? 

前一个讨论
截至目前在湖南张家界还有754个旅行团 共1.19万人,目前情况如何?
下一个讨论
如果广州遭遇像河南这样的特大暴雨,能顶得住吗?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利