我与微软的代码规范之争--局部变量竟然不让初始化?

Sdílet
Vložit
  • čas přidán 21. 08. 2024
  • 代码规范竟然要求局部变量不初始化?讲一个我在微软的故事!

Komentáře • 239

  • @schiang
    @schiang Před 3 měsíci +194

    微軟的公司文化還是很不錯的,換作是小公司,可能前輩就開始冷嘲熱諷「你不知道初始化會消耗性能嗎?」之類的,更別提更新 coding standard 了。

    • @yuan.pingchen3056
      @yuan.pingchen3056 Před 3 měsíci +13

      外鬥外行內鬥內行

    • @xpfansrup6924
      @xpfansrup6924 Před 3 měsíci +14

      我們公司code review時,就因為這個2個人吵起來了,還發到全公司論壇相互攻擊,哈哈

    • @yuan.pingchen3056
      @yuan.pingchen3056 Před 3 měsíci

      @@xpfansrup6924 code review時批評到不行的code過了不久自己也寫出差不多的代碼 然後自吹自擂

    • @user-abiko_cccc
      @user-abiko_cccc Před 3 měsíci +5

      初始化根本不会影响多少性能的。赋个值而已,能占几个字节?只要别new就行。只有new 才会影响性能。

    • @yuan.pingchen3056
      @yuan.pingchen3056 Před 3 měsíci +13

      @@user-abiko_cccc 你的評論毫無價值

  • @po6577
    @po6577 Před 3 měsíci +70

    不管如何,我只覺得這樣的溝通很屌,所有人的不是盲目做事,非常了解自己的目的

    • @big-mouth-2023
      @big-mouth-2023 Před 3 měsíci +8

      要不它咋就是微软呢?如果都是一群固执己见的家伙,我们早就没有Windows用了

    • @user-jn6op8ku4r
      @user-jn6op8ku4r Před 3 měsíci +2

      这都是建立在极其稳定的工作状态之下的,要是大家都在赶进度,呵呵

    • @user-wy1mo7tn2q
      @user-wy1mo7tn2q Před 3 měsíci +2

      代碼不會騙人,會寫的邏輯都好一點,只是需要溝通去處理,能運行跟不能運行的差別。
      其他產業 : 坑矇拐騙...外行指導內行是常態,幹 !

  • @jiazhechen
    @jiazhechen Před 3 měsíci +127

    我的收获:微软partner level的人也愿意给级别低很多的员工回答问题,速度还很快。微软的内部文化应该可以说是相当好了吧。

  • @AL-ps5ct
    @AL-ps5ct Před 3 měsíci +32

    第一位大牛说以前的性能组告诉他会影响性能,所以不要初始化。现在的性能组说要初始化。我的理解是时代和硬件的发展带来的转变。

    • @user-do8cv4te2d
      @user-do8cv4te2d Před 2 měsíci

      是的,兩個人都沒錯,只是時空背景不同了

  • @eddylin377
    @eddylin377 Před 3 měsíci +22

    可以在下班之後看到PG們的日常真的很有趣,期待之後各種趣聞

  • @Yueyelongbob
    @Yueyelongbob Před 3 měsíci +16

    整件故事的前三者都是以程序员的角度思考问题,而code standard作者则是以普通人的角度,按照普通人的习惯提出的见解(这就是差距

  • @MY-nk8ff
    @MY-nk8ff Před 3 měsíci +20

    我觉得是硬件变快了,编译器变聪明了,20,30年前的电脑要考虑优化也没什么问题。

    • @LyokoCityJeremie
      @LyokoCityJeremie Před 3 měsíci +4

      但是性能临界的场景对代码质量和编程细节的要求仍然非常关键

  • @GARYHUANG0330
    @GARYHUANG0330 Před 2 měsíci +4

    以前老師教寫程式宣告變數時一定會初始化,還真沒想過可以不初始化的寫法和考慮有無的影響。還以為微軟這種大公司齒輪轉動會特別慢,沒想到行政效率這麼高且不官僚迂腐,一般公司可能問前輩就是以前人這樣寫我就跟著這樣寫,沒原因,然後問代碼規範會得到請依照之前代碼規範之類的官腔。

  • @NotARealPerson12345
    @NotARealPerson12345 Před 3 měsíci +3

    口才很好,逻辑清晰。很赞同你最后说的8个字。

  • @user-fr1ux1de4t
    @user-fr1ux1de4t Před 3 měsíci +14

    难怪 windows 这么容易崩

  • @tobyt2336
    @tobyt2336 Před 3 měsíci +14

    之前跟別下用QT(跨平台框架)協作時,因為我用mac,對方用windows,編譯器上有些微差別,我原本完全沒初始化,我在mac上run時完全沒問題(編譯器會自動初始化值),到了windows後出了一堆bug(編譯器沒初始化值)。從此之後我都會初始化,不想多一個不穩定因素,鬼知道編譯器自動初始化會不會有啥問題或是有資安風險。

    • @neoblackcap
      @neoblackcap Před 2 měsíci

      编译器不同会导致不一样的行为,我也试过gcc编译的代码能跑,clang编译的就不能跑。所以C++的一些业界规范(Scott Meyers)都建议使用固定的编译器版本与标准库。

    • @user-gu5dn2ou3t
      @user-gu5dn2ou3t Před měsícem

      標準寫法是一定要初始化你的變數。

  • @Chloe-dr5rn
    @Chloe-dr5rn Před 3 měsíci +3

    1:23 超認同這個觀點,但我的同事主管大部分都認為效能至上...
    感覺微軟內部風氣很好呢,能夠這樣跨級討論問題
    而且不會因為問題單純就看輕,而是能真正認真討論

  • @vertears
    @vertears Před 3 měsíci +21

    这个时候就不得不提rust了,变量不初始化的情况下,使用变量编译器直接报错,真的省了很多麻烦,不知道rust什么时候能全面取代c++

    • @jiazhechen
      @jiazhechen Před 3 měsíci +5

      微软之前说他们已经准备用rust改写c++的代码,来解决内存安全问题了。rust其实也不是很完美,但是确实在合适的地方用的话能解决很多c++的问题。

    • @johanhu1208
      @johanhu1208 Před 3 měsíci +1

      如果微软使用Rust写Win 那就变成抄袭者了!

    • @BigSnowGoRide
      @BigSnowGoRide Před 2 měsíci

      ​@@johanhu1208為什麼?我對你說的這句話非常好奇

    • @miaozilong
      @miaozilong Před 2 měsíci

      @@johanhu1208 何出此言呢?语言和系统有啥关系?

  • @kiomasd
    @kiomasd Před 3 měsíci +3

    以前寫過核心中斷ISR及實時Real-time驅動,效能至上的代碼,多寫一行都會導致中斷延遲及硬體失敗,需示波器下見真章,確實就需要考慮取消初始化了

  • @rikilee1462
    @rikilee1462 Před 2 měsíci +2

    其实就是一个性能和安全的trade off;不一定需要初始化,但是应该在一个小的scope里确保被赋值

  • @xyz87332
    @xyz87332 Před 3 měsíci +3

    真正的程序员不应该拘泥于各种条条框框,知道背后原理才能以不变应万变。 首先,啥是初始化?声明变量时给个默认值。那问题来了,有时变量的初始值需要经过一系列判断才能确定,草率的给个初始值,比如0或null,不见得是安全的。如果简单的if-else就能确定初始值那完全没必要初始化变量,只要确保变量使用前肯定经过赋值就可以了。如果情况复杂,不能肯定变量使用前一定经过赋值,那给个深思熟虑的初始值可以考虑。但话说回来,如果代码复杂到都不能确定一个变量使用前是否赋过值,那这代码也是够shi的。谈到性能问题,不必要的初始化会有负面性能影响是肯定的。cpu读取初始值没命中缓存完全有可能,另外写入初始值也占用cpu指令周期,这个开小很小但不是没有。

    • @vipcxj
      @vipcxj Před 2 měsíci

      一看就是假的程序员~ 如果你没有随手初始化的习惯,哪次忘了初始化,这种错误在c++里是非常难查的。简直给自己挖了个大坑~ 没有人能保证自己永远不犯错。

    • @samztang953
      @samztang953 Před 2 měsíci

      @@vipcxj 这也就是为什么C和C++是最不安全的语言。 大约有70%的安全漏洞源自于内存泄漏带来的问题。

    • @silascript
      @silascript Před 2 měsíci

      @@samztang953 C和C++的思想是给程序员最大的自主性!

  • @TheCbsghost
    @TheCbsghost Před 3 měsíci +6

    在有加O flag的情況下,這裡的初始化並不是真的初始化,是對編譯器的一個提示,表示第一次使用到這個變數時,請編譯器幫我賦予指定的值
    如果clang可以從下文知道第一次需要賦值的地方,那麼前面的賦值IR code就會被優化而刪除,因此通常不會對緩存有任何影響,太複雜的code反而是需要被檢視的(是否用了一些奇怪的寫法導致clang看不懂上下文的關係)
    真的需要實際賦值的地方,例如安全優先的實作,會在函式上方明確的做一次memset

  • @user-abiko_cccc
    @user-abiko_cccc Před 3 měsíci +3

    写了那么多年代码还是头一次听说变量不让初始化的....赋值几个变量真能影响多少性能吗?我表示强烈怀疑...所谓的影响性能估计是他们把“初始化赋值”和 初始化的时候 new 对象给混淆了吧.....只有new 对象才会影响性能的....一个指针等于null 能给内存占多大空间?而且,一个很难理解的逻辑是,变量被定义的一刻起,就应该想好了这个变量是用来干啥的。不初始化变量就好像是你都没想好这个变量是要用来干啥,就把它先定义起来放在一边...(好像是你还没想好干啥就从工具箱里把工具拿出来晾着一样)听上去就觉得一种不负责任的感觉....反正对我来说,如果我定义了一个变量,那一定是已经想好了它要用来接什么东西,所以定义的同时,赋值号就已经跟上了....

  • @HaozheYuda1989
    @HaozheYuda1989 Před 3 měsíci +9

    这个故事告诉我们你当初没看代码规范文件😂😂😂

    • @Ryan-gf1sz
      @Ryan-gf1sz Před 3 měsíci +4

      XD
      誰能保證看完公司每一條規則才開始動工
      太強人所難吧

    • @steaegg
      @steaegg Před 2 měsíci

      看完代码规范后,发现自己所在的项目不在规范的scope里😢

  • @davidxia1502
    @davidxia1502 Před 2 měsíci +2

    新的严肃语言都强制初始化了 比如 golang rust。 可见这种变量应该初始化已经是工业界共识了 我说的是一切变量 而不只是局部变量

    • @miaozilong
      @miaozilong Před 2 měsíci

      严格意义上来说 确实初始化会带来性能损耗。只是现在的CPU性能好了而已。你换386写代码就能看出区别了,不能用现在的眼光来要求过去的程序员和规范。

    • @davidxia1502
      @davidxia1502 Před měsícem

      @@miaozilong 是的 严格意义上来说汇编语言更高效 他们应该都是汇编程序员吧?否则就不理解了。
      变量初始化那么一点点的性能损失显然是微不足道的
      老的程序员没有这种规范 只能是这些人以前编程习惯太差 绝对不是因为他们了解他们在为了提高性能而做的妥协
      就算他们有这种想法 那这种想法也是偏离事实的 远不是想象的那么影响性能
      1局部变量 编译器把很多局部变量从栈空间都优化成了寄存器了 这些程序员知道寄存器存储一次速度多快吗? 但凡程序写得稍微一点点点点点点不够好 牺牲的效率都够寄存器存储运行多少亿次了
      2 堆对象 堆对象 分配一次 极其浪费资源 再浪废一丢丢初始化一下 能咋滴? 就好像你已经花5000块吃了大餐 却不愿意再花5毛钱买包擦嘴的纸 说影响家庭经济状况…
      3 对于静态变量 这种初始化整个程序启动就运行一次 根本微不足道
      所以总结一下 没有数据支撑的想当然的优化 都是刷流氓

  • @kz-xv1pm
    @kz-xv1pm Před 3 měsíci +21

    我认同架构师的观点,局部变量每次运行都要初始化,浪费性能。至于缓存命中的问题倒是未必存在,局部变量保存在栈或者寄存器中,不存在地址空间跳跃的问题。

    • @byersroger5774
      @byersroger5774 Před 3 měsíci +1

      和安全相比,所谓的性能浪费可能真的不是太大的问题。高性能的错误程序没有价值。

    • @kz-xv1pm
      @kz-xv1pm Před 3 měsíci +1

      怎么写代码是没有唯一的标准的。我们都会开发两种代码,一种是写给别人的,要符合公司或者发包方的要求,一种是写给自己的,可以按照自己的喜好来。

    • @MDM992
      @MDM992 Před 3 měsíci

      性能問題我覺得應該要用工具分析瓶頸再處理
      過早優化 滋生臭蟲

    • @atussentinel
      @atussentinel Před 3 měsíci

      大多数的初始化编译器也能优化掉吧,比如所有path中某一个变量都在读取前有赋值,那么初始化赋值就是可以不做的。

    • @ZZQ95
      @ZZQ95 Před 3 měsíci +1

      没有人能写出完美的代码,如果不想被自己的bug逼到墙角,最好还是手脚干净点,路子不要太野,变量初始化是非常必要的,为此付出的性能代价在如今看微不足道

  • @tianyang5241
    @tianyang5241 Před 3 měsíci +6

    java表示不服,idea会把多余的变量初始化显示为灰色,告诉你这一步是多余的

    • @demon4874
      @demon4874 Před 3 měsíci +1

      確實😂

    • @vipcxj
      @vipcxj Před 2 měsíci

      这没法同日而语,c++不初始化是未定义行为,编译器可能给你初始化为一个非0值,对于靠是不是0来判断野指针的约定直接失效,一旦出问题,未初始化的地方离你出问题的地方可能差了十万八千里~ java则是你没初始化要么编译不过,要么就不存在上述提到的问题~

    • @miaozilong
      @miaozilong Před 2 měsíci

      java在虚拟机层次是会自动初始化的。

    • @miaozilong
      @miaozilong Před 2 měsíci

      不存在这个问题。

  • @009game7
    @009game7 Před 3 měsíci +6

    公说公有理的事。

  • @heyjude776
    @heyjude776 Před 3 měsíci +3

    太喜歡這個故事了 :D:D:D

  • @YiuMingLai
    @YiuMingLai Před 3 měsíci +5

    初始能解決問題嗎?不是寫unit test 就能測到嗎? 寫入初始值要clock cycle,那怕是L1,需要profiler去說明嗎?

    • @YiuMingLai
      @YiuMingLai Před 3 měsíci +1

      還有無謂的初始化就是race condition 最好既attack vectors

  • @supersonics9196
    @supersonics9196 Před 2 měsíci

    沒有聽上面的人說什麼就是什麼,這才是故事的背後意義。挺好

  • @user-df7tv1xs9q
    @user-df7tv1xs9q Před 3 měsíci +3

    分情况,不能太教条。int ret = -1; 这种要初始化; char buffer[1024]; 这种的没必要初始化。

  • @louda99
    @louda99 Před 3 měsíci

    1.我看影片指的是Kernel 程式,那效能確實要注意。Kernel 程式最好是效能好且程式碼以及佔用資源要少。
    我的看法,應該是由code checker 之類,去分析發現那段程式碼使用這個區域變數,但是未做初始化。
    2. 如果真的要初始化,那最好是新的程式再加就好或是新一代產品再做這件事
    ,原本發行的穩定版本不要動

    • @tmzhangztm
      @tmzhangztm Před 2 měsíci

      如果code checker能够发现一个变量没有初始化就是用,那么compiler也能发现并优化掉未使用的初始化

  • @albertyi4798
    @albertyi4798 Před 2 měsíci

    如果必须初始化,可以修改编译器,让所有没有显式初始化的变量自动置null,高级语言c#和java都是这么做的。c,c++不这么做肯定是有它的道理的。

  • @javen2532
    @javen2532 Před 2 měsíci

    在做极端性能敏感的代码profiling时应该谨慎使用profiler 尽可能使用代码内建的timing
    一般来说用profiler的时候需要生成带debug info的code 这一般会带来超过20%的性能损失

  • @lumynou5
    @lumynou5 Před 2 měsíci

    我個人的習慣是看初始化是否有必要,以 C 來說:
    如果依照現代的「變數作用域應盡可能小」規範,for 迴圈的迭代變數應該聲明在其括號中的初始化述句,自然也只能在那裡初始化。
    for (int i = 0; i < len; ++i) {
    通常來說變數應該初始化,除少數例外。例如變數馬上就要取址傳給一個函式作為「輸出參數」,此時初始化顯然沒意義,且效能確實有差(多一個 mov 指令)。另外編譯器無法得知變數的初始化沒有意義並對此最佳化,因此在這種情況初始化是允許的。
    int x;
    sscanf(data, "%d", &x);
    註:上例中應檢查 sscanf 回傳值,否則若匹配失敗 x 的值未定義。由於匹配失敗後 sscanf 會立刻回傳,如果不關心成功與否,亦可初始化變數作為在匹配失敗時的預設值,如此可達到無分支。
    C++ 的情況又更複雜,不容易看出來實際上做了什麼,例如:
    std::string str;
    呼叫了 std::string 的預設建構子,str 會初始化成空字串。

  • @joezhou9449
    @joezhou9449 Před 2 měsíci

    初不初始化真的看公司,我们写hft algo时必须用很多premature optimisation,你举的例子里的就已经有两个雷了,毕竟hot path的cache miss永远都是最大问题所在。

  • @easonzhang662
    @easonzhang662 Před 3 měsíci

    听着你讲故事, 感觉你越来越帅了 (doge

  • @liuwenming
    @liuwenming Před 2 měsíci +1

    上班刷到了这个, 然后搜了下teams,找到了你,哈哈

  • @caesun
    @caesun Před 2 měsíci

    代码规范把局部变量初始化作为建议级别更好,让程序员根据情况自己决定。
    相关的问题就是函数不要太大,变量未初始化引起的问题一个原因就是函数太大不容易发现问题。

  • @user-rb4mu9hl1o
    @user-rb4mu9hl1o Před 2 měsíci

    其实双方都能找到有利于与自己观点的例子,也能接受对方的说法,因为大家都在阐述现实的问题,每个人的价值判断不同,因而做出了不同的取舍。
    假如c编译器能够对所有变量未初始化的情况都能报错,那么规定局部变量不得初始化,感觉就挺合理的(遵循快速失败原则,奥卡姆剃刀原理),但实际情况是编译器并没有这么完善,所以这个规范就显得过于理想化了

  • @tortoise133
    @tortoise133 Před 3 měsíci +2

    這影片我喜歡~

  • @KiKi-yu3sg
    @KiKi-yu3sg Před 2 měsíci +1

    你这种理解太肤浅了
    该不该初始化和你说的都没关系
    首先这里初始化特指不初始化内存
    那么其实真正应该讨论的是:
    该内存的可能值是否都是该变量声明类型的一个有效值
    如果是 那么不初始化内存的语义就是:“我得到了一个虽然不知道值确切是什么 但我知道这个值一定是符合该编译期类型的变量”
    如果不是 那么可能的行为是 值可能都不是该编译期类型的一个有效值
    只有第二种情况才应该初始化 不是为了性能
    而是因为运行时的值有可能已经违反了编译期类型的约束
    再稍微深入一点点
    由于大部分语言的静态类型系统非常孱弱
    而且大部分程序员素质极差
    声明的变量类型通常就是一个他所知道的最大陪域
    比如实际需求中某个整数取值范围只可能是0-10
    但是一般他就会写int8_t
    但是实际上int8_t只是实际定义域int的一个陪域
    如果不初始化内存
    那么int8_t x的语义就是 x是一个特定值 且 x ∈ int_8
    但是x是否属于int 是不一定的
    这种情况下 就应该初始化 为 int中的一个有效值
    比如请问 x ∈ float 那么 sin(x) ∈ ?
    当然 你说属于float 也没错
    但是只是一个非常偷懒的陪域罢了
    更好的类型应该是 0到1之间的浮点数 比如记作float
    如果你的变量是用于写入 sin(x)的结果的
    但是变量类型你写的是float
    你说该不该初始化呢?
    首先 对于 sizeof(float) 字节的内存任意取值 是否任意值都是一个有效的float?(这里有效并不是指NaN -NaN -0之类似乎是某种无效值 而是说这个值是否在这种类型中被defined 这些看似无效值都是被定义的)答案是根据IEEE 754规范定义的浮点数来说 是的
    但是是否每个属于float的值都是一个有效的float呢?当然不是
    不过由于你编译期类型写的是float
    那么不初始化也合理
    但是你得意识到之后可能发生运行时异常
    比如你拿这个变量去算acos
    可能发生异常的原因并不在于你这里没有初始化
    而是就算你初始化了也只能知道x∈float
    而acos的定义域是而不是float
    可是float 属于 float 所以如果编译期类型是float 你完全不用担心
    问题在于如果你实现了编译期类型float 要不要初始化内存呢?
    要不要取决于
    假设任何值 x 属于类型 T
    x通过某种编码方式映射到内存值m∈M
    如果任意m∈M 都有这样的映射 E(m) => T 也就是满射 简单的说就是 任意m都能编码成某个T的合法值
    那么不初始化是合理的

  • @sdyyhsu
    @sdyyhsu Před 3 měsíci

    我也習慣初始化區域變數,但在車用安全的規範misraC中,確反而容易因為初始化變量觸犯規範「在值沒使用前重新賦值」

  • @haihonghuang
    @haihonghuang Před 3 měsíci

    不同领域会有不同的编程规范,我上一个公司就要求所有的变量必须在声明的时候初始化。当然软件是安全相关工业控制软件。

  • @pengwang2207
    @pengwang2207 Před 3 měsíci +4

    并不苟同你的关于局部变量的观点。首先,初始化对性能有影响几乎是必然的,除非编译器能把不必要的初始化给优化掉。当然大部分情况下,这点性能影响是完全可以忽略的。但可以忽略不是没有影响。其次,我反对一刀切的全部要初始化或全部不能初始化。最初问题的真正症结不是变量没有初始化,而是代码质量管控流程的问题。当然现有工具不能抓出所有问题,人工检验也可能是有疏漏的。但全部初始化只是简单粗暴的隐藏了真正问题。因为声明变量的时候,首先面对的几个问题就是变量干啥的,scope从哪儿到哪儿,如果需要初始化的话初始值应该是多少。这也是为什么错误码不让初始化的原因(这个我也是有异议的)。显然相似的情境不仅仅只有错误码。如果知道正确初始值的话,也意味着知道哪里真正开始需要赋值。

    • @TK-lr9ur
      @TK-lr9ur Před 3 měsíci

      我看第一行的時候以為我後面準備要看到32號混凝土了==
      結果是我太不正經了XD

    • @user-oj9hz8rn8g
      @user-oj9hz8rn8g Před 2 měsíci

      说得好,BTW,“为什么……的原因”是病句

  • @TobyLeung0721
    @TobyLeung0721 Před 3 měsíci +1

    我覺得undefined value 是有用的,有error是因為null checking沒做好,這是兩個不同的問題

    • @MaxwellHay
      @MaxwellHay Před 3 měsíci +1

      你拿js来理解c呢?😂

    • @chdglode
      @chdglode Před 3 měsíci

      @@MaxwellHay downgrade 😜

  • @a831202aa831202a
    @a831202aa831202a Před 3 měsíci +1

    好有趣~! 謝謝你的分享

  • @yx4722
    @yx4722 Před 3 měsíci +4

    这是一个用办公室政治来解决问题的典型例子:支持自己观点的关键证据和数据没有,去找“法条”和高级别的人...

    • @yanaya713
      @yanaya713 Před 3 měsíci +4

      这事本来是技术探讨,但没拿捏好就可能搞成办公室政治。但看描述从头到尾仍然就是技术探讨,微软文化挺好的。

    • @atussentinel
      @atussentinel Před 3 měsíci +2

      本案例没有拿法条攻击别人,所以我觉得找法条在这里不算办公室政治
      那个性能组的人明显是支持要初始化的观点的,也不能算支持自己观点的证据没有
      总体来说还是在技术范围

    • @yx4722
      @yx4722 Před 3 měsíci

      @@atussentinel 我没说“攻击”,我在说技术讨论中用xxxx编程规范这类“法条”为自己壮胆,但就如在司法体系中一样有法院和法官对控辩双方对条款的解读进行裁决一样,怎么知道这个编程规范在这种情况下就适用? 要有数据来支撑,而找了Xxx组的某个人或者partner level的人最多算证人。 而真实世界不是非黑即白的,也就没必要争论到底一个驼峰的还是两个驼峰的骆驼好,不想把关系闹僵,也就ok吧,这就是典型的办公室政治

    • @InteOMG
      @InteOMG Před 3 měsíci

      @@yx4722引用编程规范去argu是正确的做法。编程规范就是需要不停地被引用,这样规范才会不停地被修正。编程规范和法律条款是完全不同的东西。编程规范是程序员经验的总结。是来帮助程序员的,不是用来judge程序员的。因为实际需要,导致某段代码必须偏离编程规范。这不是程序员有问题,而是编程规范有问题。反之,你啥特殊情况没有,非要跟大家都认可的写法反着来?

  • @vann1984
    @vann1984 Před 3 měsíci +2

    非常好的分享, 感謝你的付出!

  • @m4u281
    @m4u281 Před 3 měsíci +1

    说白了早期的代码规范的目的是通过利用编译器提示开发者代码逻辑的完整性, 却把安全性都丢给了编译组. 算是偷懒耍滑吗🤣

  • @atony8155
    @atony8155 Před 3 měsíci +2

    很讚的分享 感想

  • @guangzongchen5419
    @guangzongchen5419 Před 2 měsíci

    I am not sure when they start apply this rule. If you used C89, the standard does not allow initialization with declare. It require all variable declare at the beginning of the function. (This is from my memory. May not exactly what it is). So maybe there are some historical reason for the rule.

  • @jinhongzou7474
    @jinhongzou7474 Před 3 měsíci

    既然认为一定要初始化才安全,是不是也该证明初始化能修复多少问题?毕竟追加初始化等同于所有变量重写,如果修复不了多少问题,也是得不偿失的。

  • @42cyborg65
    @42cyborg65 Před 3 měsíci

    这就是为什么windows里要引入rust:放心大胆不要初始化,编译器会找到所有问题

  • @huhuwu8
    @huhuwu8 Před 3 měsíci +1

    在一個這麼大的公司裡,對於已經傳承維護了數十年的代碼,仍能有效的上下溝通,並且負責任的探討問題,讓我非常驚訝
    -讓我更驚訝的是,那為什麼這年頭Windows還是一次更新一次驚,bug越更新越多-

  • @lieyan9959
    @lieyan9959 Před 2 měsíci

    profiling并不是万能的吧。假如变量初始化对性能有影响,但是因为分布在所有函数之中,你在不知道原因的情况下怎么通过profiling找到问题?

  • @pauzhou8639
    @pauzhou8639 Před 2 měsíci

    你的视频好有趣呀

  • @qaz10102030
    @qaz10102030 Před 3 měsíci +1

    7:36 我還以為是: 長按點讚 一鍵三連 XD

  • @jui-shuyeh6807
    @jui-shuyeh6807 Před 3 měsíci +3

    感謝天哥

  • @MichaelSong-ob5mo
    @MichaelSong-ob5mo Před 3 měsíci

    Keep in mind it IS always necessary to initialize variables to a known state regardless they have global or local scope,
    the guys who tell you otherwise hide the fact that ram is initialize to 0 following POST on bootup. But, subsequent reuse of the stack (where local variables reside) in kernel will deterministically get assigned random values from garbage left behind by previous usage, do you still question the necessity to initialize local variables?

  • @adakdnn2793
    @adakdnn2793 Před 3 měsíci

    這種問題溝通幾次有火藥味就公審了

  • @user-mg3ey1uq8f
    @user-mg3ey1uq8f Před 3 měsíci +1

    好想加入啊啊.太強ㄌ

  • @anabit2383
    @anabit2383 Před 3 měsíci +1

    会不会可能是历史问题;在某些CPU或者某些编译器上会出这样那样的问题

  • @carloswei_cn
    @carloswei_cn Před 2 měsíci

    在ARM security做嵌入式方面的,那时候follow的都是MISRA-C的规定。当时有QAC的rule不允许局部变量在定义一开始全部初始化,要求使用变量最近的前面的位置时候进行初始化。GNU的编译器应该不会有这么严格的检查,但是ARM的商业编译器是可以检测出来if分支初始化的这种情况。

  • @leleliu008
    @leleliu008 Před 3 měsíci

    教条主义在大公司里是普遍存在的。他们大多数时候只是把个人爱好强加于整个公司,别太过于信奉这些东西。根据实际情况自行选择。

  • @haoshen6654
    @haoshen6654 Před 2 měsíci

    这个tradeoff代价有点大,而且也无法根本解决复杂的情况。这也许还可以解释为什么windows直到今天还会时不时的蓝屏。这实际上就是把运行时的风险甩锅给了用户😂

  • @kingofkors
    @kingofkors Před 3 měsíci

    怀疑初始化带来的性能影响可能是真的,而且明显,但是渐渐就跟其他影响混合在一起,实验求证太麻烦,所以不在乎了,程序员开心就好。整件事里没有人真正测试对比了前后对性能的影响,反正影响不大,忽略算了

  • @user-jp6np4ds9y
    @user-jp6np4ds9y Před 3 měsíci +2

    想問一下大大,為什麼微軟總是喜歡強迫人更新、像xp, 7 那樣不是很好嗎
    已經被更新雷過超多次了...

    • @minkoder
      @minkoder  Před 3 měsíci +2

      不光是微软,苹果,Linux,Python,所有的软件,只要还在开发,就会要求你更新。

    • @youalbert1900
      @youalbert1900 Před 3 měsíci +1

      XP, Win7 時代,
      系統開發以穩定,好用為主要目標,
      資安問題並沒有像如今一般受到重視.
      就像當你開的車子只需要穿越都市的街頭時,
      你不需要去考慮防彈,防爆,防電磁干擾,越野能力的問題.
      但是當你的車子需要帶你穿越槍林彈雨滿佈彈坑的戰區時,
      隨時補強漏洞在關鍵時刻才能救你一命.

    • @529frank6
      @529frank6 Před 3 měsíci +1

      @@minkoder 为啥不建议给错误码规定一个未初始化的值,每次错误码定义时都赋成这个值,这不比不初始化更合理吗?

    • @user-jp6np4ds9y
      @user-jp6np4ds9y Před 3 měsíci

      @@minkoder 謝謝大大回覆
      覺得更新合理,但是也不要趁人沒再用就偷更新、只能關機+更新、或是偷塞copilot給你
      曾經看過開會時有人要報PPT,結果在那邊更新...(一堆大老高管的會
      也有過跑自己的.net程序要處理檔案(要處理快1天那種)、結果隔天來收資料只跑3,4小時...因為被偷更新重新開機了...
      非常好奇微軟的程式設計師都不曾遇過上述問題嗎
      也很好奇微軟的windows based的developer都用什麼版本的windows、我也想用一樣的0.0

    • @Eartzh
      @Eartzh Před 2 měsíci

      @@minkoder 我覺得樓主的問題比較屬於"在其他程序(像是你舉例的)關於update都屬於 'info' 頂多 'warning' 的層級,
      為什麼Windows 10+要做成 '想要用GUI正常關機必須得更新' 這種UI看起來甚至能說是 'error' 的層級"
      不過個人覺得這比較像是UI/UX那邊的問題

  • @Yang-ez7be
    @Yang-ez7be Před 2 měsíci

    表情很好🎉🎉

  • @johanhu1208
    @johanhu1208 Před 3 měsíci +1

    用Go基本不初始化

  • @kun6248
    @kun6248 Před 3 měsíci

    可能更多和类型有关系吧,内核大部分都是重新定义的类型,如果都需要有一个初始化值的话,确实不是很好写

  • @sarrow104
    @sarrow104 Před 2 měsíci +1

    兄弟,你脊椎是否有点侧弯?

  • @spinach660
    @spinach660 Před 3 měsíci

    这个估计是dos时期的传统了, 当年确实是扣这一点点性能

  • @haoshen6654
    @haoshen6654 Před 2 měsíci

    这是一个happy ending.

  • @vvxx2287
    @vvxx2287 Před 3 měsíci +1

    我怎么很久之前就看过这个视频

  • @estrdocn2253
    @estrdocn2253 Před 2 měsíci

    说句不好听的,这个问题感觉是新手程序员面临的一个重点问题而不是一个老程序员写了这么多年的项目才发现的😂

  • @hw203
    @hw203 Před 3 měsíci

    静态检测代码时,会报复写警告,【一个变量被写入2次后才被使用。】

  • @oldmannt
    @oldmannt Před 3 měsíci +1

    沟通很重要

  • @sunlovesusu
    @sunlovesusu Před 3 měsíci

    我很好奇,如果真的做profiling,结果会如何?如果是段关键代码,微软是如何做impact analysis的?还是说其实很多代码也是有遗留问题在等待发现😂。最后,真的是标题党😅

  • @anivilin
    @anivilin Před měsícem

    我看到的:一个这么显而易见的问题居然最后是一个新人随口一问才解决的?整个内核的规范就这么改了?😂太随意了吧

  • @SetzerYeh
    @SetzerYeh Před 3 měsíci

    使用VS2022時,一直報出 初始化某某變數的warning
    就一直覺得很彆扭

  • @jamishonj3884
    @jamishonj3884 Před 2 měsíci

    对执行效率要求不高的函数里需要初始化,有效率要求的不用初始化,因为初始化是要浪费CPU和内存资源的

  • @Flora7489
    @Flora7489 Před 2 měsíci

    编译器确实不会提示,但是我感觉新的aws codewhisperer 应该会

  • @xjy-mg9lz
    @xjy-mg9lz Před 2 měsíci

    也有可能是当初定下规则的人不在其位,换了个觉得无所谓的领导。硬件性能就是这么被编程的人一点点浪费的。问题的本质是,初始化是否产生额外的硬件开销,有就是可优化掉的。是通过初始化防止你错用,还是借助编译器查错,是开发效率的问题。就个码农,浮夸

  • @krispan4559
    @krispan4559 Před 3 měsíci

    建議問問compiler,確定了compiler再來談code style

  • @mudcfu
    @mudcfu Před 3 měsíci

    不錯不錯

  • @b_2u
    @b_2u Před 3 měsíci +1

    不太懂,一個變量既然會存在,代表他在整個程式裡的某一段終究會被初始化吧? 那為什麼不在真正用到他時再聲明呢?

    • @yuan.pingchen3056
      @yuan.pingchen3056 Před 3 měsíci +6

      kernel 通常是用C寫的 為了相容早期的C語言標準 變量通常在函式入口處聲明 用到再聲明是C++編譯器的標準 當然不排除更新的C語言標準也加入了這個功能

    • @Yueyelongbob
      @Yueyelongbob Před 3 měsíci +1

      声明和初始化是两种不同的步骤,声明是必要的步骤用途是定位层级[1*],而初始化则是赋空值的操作。
      一般更倾向于初始化,因为在循环操作中我们不会浪费时间去判断变量是否有内容。
      又因为在赋值前,经常会先取值。比如a = a + 1,如果a没有初始化就会出错。
      [*1]: (比如学校发生的事老师可能不知道,但校长必定知道,因为层级不同)

    • @b_2u
      @b_2u Před 3 měsíci

      @@yuan.pingchen3056 原來如此,讓我想起以前寫arduino,大家好像也喜歡在入口全部聲明完

    • @b_2u
      @b_2u Před 3 měsíci

      @@Yueyelongbob 我想說相較於
      int a
      /* codes */
      a = 0 ( 可能忘記加)
      a = a + 1
      不如改成
      /* codes */
      int a = 0
      a += 1;

    • @b_2u
      @b_2u Před 3 měsíci

      @@yuan.pingchen3056 原來,讓我想起一起寫arduino,大家也普遍喜歡在開頭先全部聲明

  • @noarywang6172
    @noarywang6172 Před 2 měsíci +1

    定义变量肯定要初始化,鬼知道那块内存里原来有啥

    • @miaozilong
      @miaozilong Před 2 měsíci

      老哥, 说的绝对了吧,建议重新看下视频

    • @noarywang6172
      @noarywang6172 Před 2 měsíci

      @@miaozilong 一点都不绝对,我曾经定义过一个全局double变量,跑起来发现不对,print发现里面是难以理解的值,初始化之后就好了

    • @miaozilong
      @miaozilong Před 2 měsíci

      @@noarywang6172 如果这个double值只是用于交换两个double类型数据的顺序,就没必要去初始化了吧。

  • @alanjchiang
    @alanjchiang Před 2 měsíci

    有這種傳統,難怪微軟不穩定,又一直當機。

  • @leleliu008
    @leleliu008 Před 3 měsíci

    我看过很多人写代码这么写:
    int x;
    x = 5;
    我是没看懂为啥不直接写 int x =5;
    可能很多人都不知道啥是 初始化。

    • @chdglode
      @chdglode Před 3 měsíci

      估计是柯南和金庸遗风

  • @ethanwong2272
    @ethanwong2272 Před 2 měsíci

    为啥我总感觉在很久之前看过这期视频

  • @user-cs9df3xl4q
    @user-cs9df3xl4q Před 2 měsíci

    要不怎么说cpp原始呢,java rust这些现代语言都是倾向于不初始化,编译器肯定可以检查出未初始化

    • @anivilin
      @anivilin Před měsícem

      rust不好说,java倾向于初始化主要是因为他的哲学就是所有问题都给易用性让步,包括性能,如果真的有性能问题java也会毫不犹豫的抛弃掉然后选择易用性,和其它几个语言的哲学完全不同,没法对比

  • @user-jt4hg3ef9r
    @user-jt4hg3ef9r Před 3 měsíci +1

    還是不懂為啥錯誤碼不能初始化啊?

    • @zenzhu5690
      @zenzhu5690 Před 3 měsíci +1

      大概是只需要赋值一次,没必要吧。

    • @yanaya713
      @yanaya713 Před 3 měsíci +3

      错误码需要填内容,很繁琐的事,程序员经常忘。如果不初始化,编译器会报错程序员就会发现问题。

  • @wjchuang2487
    @wjchuang2487 Před 2 měsíci

    弱弱的問, 初始化會初始化成什麼呢? Null? 0? ""? []?

  • @big-mouth-2023
    @big-mouth-2023 Před 3 měsíci

    一个重要的问题没有讲啊。
    if (他们真的有重要的原因不能改这个规范) {
    怎么去对应这个Bug?
    }

  • @arthurrobin3613
    @arthurrobin3613 Před 2 měsíci

    教条主义不可取,如果初始化真那么必须编译就自己做了

  • @stevexiao1488
    @stevexiao1488 Před 3 měsíci +1

    我对微软的认识还停留在出了bug要同时按Ctr、Alt、Del。除了他们出钱支持OpenAI,好像想不起来其他创新之举。

  • @minghaoliang4311
    @minghaoliang4311 Před 2 měsíci

    用constexpr能在编译时发现更多问题吗?

  • @mirandacheng4906
    @mirandacheng4906 Před 2 měsíci

    如做硬件开发的时候不初始化可能会炸机

  • @tsaiphan5218
    @tsaiphan5218 Před 2 měsíci

    如果把错误代码视作“特殊情况”,这个“特殊”的模式到底是什么呢?或者,相同的模式也可能发生在任何地方,并没有什么特殊。

    • @miaozilong
      @miaozilong Před 2 měsíci

      编译器会照顾错误代码这个特殊情况

    • @tsaiphan5218
      @tsaiphan5218 Před 2 měsíci

      @@miaozilong 错误代码 (error code) 只是程序员的认知,编译器大抵不是这样认知的。

  • @SolarEclipse-l6y
    @SolarEclipse-l6y Před 2 měsíci

    MS居然在乎性能问题呢?

  • @kfnkxjhnaljfnkkn
    @kfnkxjhnaljfnkkn Před 3 měsíci +1

    rust就可以仅声明而不初始化

  • @jianntynglu4429
    @jianntynglu4429 Před 3 měsíci

    性能這種東西 B級妖怪以下能寫到標準數量級就足夠了
    B咖以下的程式碼穩定 簡單 好讀好懂 照A咖的風格寫自己的碼才是正道

  • @samztang953
    @samztang953 Před 2 měsíci

    My take away is that the C language is the most insecure computer language.