C/Cpp内存管理没那么难

T
TeacherWei
楼主 (未名空间)

几十万行代码,涉及内存分配释放的可以不到100行。
Cpp container质量一流,种类齐全。完全不手动分配都有可能。

当然访问越界还是会死人的。这个只能靠自觉。

我感觉,从代码量看,各种语言,包括C/Cpp,完成相同工作,代码量基本差不多。并
不是Cpp要多写代码。

反正我是把C和Cpp区别对待的。连命名风格都不一样。

a
ananpig

C的内存真是要命了
从前做裸机才明白这里的奥秘也练就了一身本事


【 在 TeacherWei (TW) 的大作中提到: 】
: 几十万行代码,涉及内存分配释放的可以不到100行。
: Cpp container质量一流,种类齐全。完全不手动分配都有可能。
: 当然访问越界还是会死人的。这个只能靠自觉。
: 我感觉,从代码量看,各种语言,包括C/Cpp,完成相同工作,代码量基本差不多。并
: 不是Cpp要多写代码。
: 反正我是把C和Cpp区别对待的。连命名风格都不一样。

h
helpme

现在关心的不是内存管理或者代码量,而是谁坑少和开发效率高。

【 在 TeacherWei (TW) 的大作中提到: 】
: 几十万行代码,涉及内存分配释放的可以不到100行。
: Cpp container质量一流,种类齐全。完全不手动分配都有可能。
: 当然访问越界还是会死人的。这个只能靠自觉。
: 我感觉,从代码量看,各种语言,包括C/Cpp,完成相同工作,代码量基本差不多。并
: 不是Cpp要多写代码。
: 反正我是把C和Cpp区别对待的。连命名风格都不一样。

b
brainless

也还好,只是把不适合这个语言的放给新的语言去做而已了

rust现在学习曲线也越来越陡
g
guvest

C越界问题第一麻烦。需要一定时间习惯培养。
除了我个人经验以外。以前HN我记得有个统计结果。

内存管理可以学会,也有一些工具可以给帮助。
较短时间内应该可以培训。

所以之前我讲过,写java的转不了C。
至少我未听闻过。原因在各种越界,乱飞指针,etc。
【 在 TeacherWei (TW) 的大作中提到: 】
: 几十万行代码,涉及内存分配释放的可以不到100行。
: Cpp container质量一流,种类齐全。完全不手动分配都有可能。
: 当然访问越界还是会死人的。这个只能靠自觉。
: 我感觉,从代码量看,各种语言,包括C/Cpp,完成相同工作,代码量基本差不多。并
: 不是Cpp要多写代码。
: 反正我是把C和Cpp区别对待的。连命名风格都不一样。

x
xiaoju

好吧,你用C++写这个试试,看看代码量和C#差多少倍

异步读一个restful API,结果解析为JSON,添加一个对象后再异步写入磁盘

【 在 TeacherWei (TW) 的大作中提到: 】
: 几十万行代码,涉及内存分配释放的可以不到100行。
: Cpp container质量一流,种类齐全。完全不手动分配都有可能。
: 当然访问越界还是会死人的。这个只能靠自觉。
: 我感觉,从代码量看,各种语言,包括C/Cpp,完成相同工作,代码量基本差不多。并
: 不是Cpp要多写代码。
: 反正我是把C和Cpp区别对待的。连命名风格都不一样。

x
xiaoju

现在像样点的板子都支持安卓和python了,屠龙之技没处用了

【 在 ananpig (别瞅 变态辣椒 漫画的●○安安猪) 的大作中提到: 】
: C的内存真是要命了
: 从前做裸机才明白这里的奥秘也练就了一身本事

T
TeacherWei

我来写,30行CPP吧。真正干活儿的也就10行以内而已。

【 在 xiaoju(可爱的龙猫) 的大作中提到: 】

: 好吧,你用C 写这个试试,看看代码量和C#差多少倍

: 异步读一个restful API,结果解析为JSON,添加一个对象后再异步写入磁盘

x
xiaoju

干活的是std::system(....)

【 在 TeacherWei (TW) 的大作中提到: 】
: 我来写,30行CPP吧。真正干活儿的也就10行以内而已。
:
: 好吧,你用C 写这个试试,看看代码量和C#差多少倍
:
: 异步读一个restful API,结果解析为JSON,添加一个对象后再异步写入磁盘
:

T
TeacherWei

说人话很难么?简直不理解你这种人。。。

【 在 xiaoju(可爱的龙猫) 的大作中提到: 】

: 干活的是std::system(....)

m
magagop

MCU了解下,RTOS重啓只需要幾毫秒,你安卓和python辦得到嗎?主力編程語言是Cpp14,純C的很囉嗦。

【 在 xiaoju(可爱的龙猫) 的大作中提到: 】

: 现在像样点的板子都支持安卓和python了,屠龙之技没处用了

m
magagop

感覺Cpp的STL庫沒有JDK好,分佈計算能力低,既不是thread safe,也不是reentrant safe,需要用第三方庫,搞得很複雜,Cpp23才部分改善。因為for循環有N種寫法,各
種花樣,分布式很容易出錯。編譯器也N多,編譯參數上百,需要科班計算機才知道區
別。

但是Cpp是很多高性能領域的唯一選擇,逐漸變成DSL。

T
TeacherWei

毛病多了去了,比如C++ STL fstream会leak file descriptors.
打开一个文件,然后立刻开child process。然后这个文件handle就会永久leak到child process里面。
这就是开文件时候没设置O_CLOEXEC。当然和老kernel不支持也有一定关系。那都是10
多年的老kernel了。C++20也是一个鸟样。因此对于我来讲fstream永久不可用。当然对于别人可能是另外的情况。
这些,永远不会有人告诉你。你要先带着问题去找答案,还不是很容易能找到。

【 在 magagop (magagop) 的大作中提到: 】
: 感覺Cpp的STL庫沒有JDK好,分佈計算能力低,既不是thread safe,也不是
reentrant
: safe,需要用第三方庫,搞得很複雜,Cpp23才部分改善。因為for循環有N種寫法,各
: 種花樣,分布式很容易出錯。編譯器也N多,編譯參數上百,需要科班計算機才知道區
: 別。
: 但是Cpp是很多高性能領域的唯一選擇,逐漸變成DSL。

n
nayinian

现在内存还是个事吗?cloud 里的vm几秒钟给你调到几千个G.
n
netghost

那基本上就是printf("2000G"),你想要多少都行。

【 在 nayinian (那一年) 的大作中提到: 】
: 现在内存还是个事吗?cloud 里的vm几秒钟给你调到几千个G.

p
pptwo

JDK连个大数组都不支持,写Unsafe跟写C没啥区别。

【 在 magagop (magagop) 的大作中提到: 】
: 感覺Cpp的STL庫沒有JDK好,分佈計算能力低,既不是thread safe,也不是
reentrant
: safe,需要用第三方庫,搞得很複雜,Cpp23才部分改善。因為for循環有N種寫法,各
: 種花樣,分布式很容易出錯。編譯器也N多,編譯參數上百,需要科班計算機才知道區
: 別。
: 但是Cpp是很多高性能領域的唯一選擇,逐漸變成DSL。

p
pptwo

iostream这种30多年前的烂设计,除了课本真有人用?

【 在 TeacherWei (TW) 的大作中提到: 】
: 毛病多了去了,比如C++ STL fstream会leak file descriptors.
: 打开一个文件,然后立刻开child process。然后这个文件handle就会永久leak到
child
: process里面。
: 这就是开文件时候没设置O_CLOEXEC。当然和老kernel不支持也有一定关系。那都是
10
: 多年的老kernel了。C++20也是一个鸟样。因此对于我来讲fstream永久不可用。当然对
: 于别人可能是另外的情况。
: 这些,永远不会有人告诉你。你要先带着问题去找答案,还不是很容易能找到。
: reentrant

g
guvest

Lots of
"#include "
can be found in github projects.
【 在 pptwo (pp) 的大作中提到: 】
: iostream这种30多年前的烂设计,除了课本真有人用?
: child
: 10

p
pptwo

很多学生把作业放到github上好在简历里充数 ...

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: Lots of
: "#include "
: can be found in github projects.

h
helpme

某些hedge fund里面的trading platform还直接call呢

【 在 pptwo (pp) 的大作中提到: 】
: iostream这种30多年前的烂设计,除了课本真有人用?
: child
: 10

T
TeacherWei

绝大多数都要跟着标准走。
自己的类,都要overload一个iostream的序列化方法呢。
不敢说99%,90%以上是这样的。。。

【 在 pptwo (pp) 的大作中提到: 】
: iostream这种30多年前的烂设计,除了课本真有人用?
: child
: 10

l
lightroom

c/c++是设计给懂os的人用的。所谓的坑都和系统有关。所为新语言的新特性都是把os
的东西包一下。现在的语言是设计尽量降低os的门槛。
n
netghost

UNIX本來 fork和exec就是兩個事情。一般來說,fork之後在exec前是要做一堆事情的。

這個情況,exec前關掉不需要的文件描述符就完事了,O_CLOEXEC省點事情而已。

【 在 TeacherWei (TW) 的大作中提到: 】
: 毛病多了去了,比如C++ STL fstream会leak file descriptors.
: 打开一个文件,然后立刻开child process。然后这个文件handle就会永久leak到
child
: process里面。
: 这就是开文件时候没设置O_CLOEXEC。当然和老kernel不支持也有一定关系。那都是
10
: 多年的老kernel了。C++20也是一个鸟样。因此对于我来讲fstream永久不可用。当然对
: 于别人可能是另外的情况。
: 这些,永远不会有人告诉你。你要先带着问题去找答案,还不是很容易能找到。
: reentrant

T
TeacherWei

开玩笑吧?
你开了一大堆std fstream,然后fork/exec,你来教教我,怎么close那些fstream?
自己的都close不掉,更何况第三方别人的?

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: UNIX本來 fork和exec就是兩個事情。一般來說,fork之後在exec前是要做一堆事情
的。
: 這個情況,exec前關掉不需要的文件描述符就完事了,O_CLOEXEC省點事情而已。
: child
: 10

n
netghost

你知道我在說什麼吧?
想吵架就算了,沒閒工夫。

【 在 TeacherWei (TW) 的大作中提到: 】
: 开玩笑吧?
: 你开了一大堆std fstream,然后fork/exec,你来教教我,怎么close那些fstream?: 自己的都close不掉,更何况第三方别人的?
: 的。

h
helpme

对,秒怂尿遁。

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 你知道我在說什麼吧?
: 想吵架就算了,沒閒工夫。

g
guvest

C系列语言,不全是OS的问题。

从语言特点来看,
Buff越界,飞指针是硬伤。代码量越大,出问题的概率越大。
这是不可改变的。跟OS无关。我觉得其实都可以建立概率模型。

现实项目的目标是控制这些问题的危害。而不是谋求没个地方都没问题。因为就算你现在没问题了,下一个版本从头查也不现实。或者客户让你稍微定制一点,改一点,也无法从头再查一次。

任何一个web borowser,往往用几个小时内存就有涨到无穷大的趋势……
。但是危害并不大。
【 在 lightroom(吃一条鱼,思考一个问题,法号三丰) 的大作中提到: 】
<br>: c/c 是设计给懂os的人用的。所谓的坑都和系统有关。所为新语言的新
特性都
是把os
<br>: 的东西包一下。现在的语言是设计尽量降低os的门槛。
<br>

x
xiaoju

你贴10行代码很难么?

【 在 TeacherWei (TW) 的大作中提到: 】
: 说人话很难么?简直不理解你这种人。。。
:
: 干活的是std::system(....)
:

x
xiaoju

RTOS的应用领域太小了,就算是真要实时,也得躲开C++防止反应堆爆炸汽车刹不住车

【 在 magagop (magagop) 的大作中提到: 】
: MCU了解下,RTOS重啓只需要幾毫秒,你安卓和python辦得到嗎?主力編程語言是
Cpp14
: ,純C的很囉嗦。
:
: 现在像样点的板子都支持安卓和python了,屠龙之技没处用了
:

n
netghost

你要怕越界,自己寫個buf,自帶一個長度,改get(x, n),set(x,n),總共10行代碼,能有多大事?

本來計算機就不知道什麼是界,你要硬性定義就是會造成某些事情幹不了。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: C系列语言,不全是OS的问题。
: 从语言特点来看,
: Buff越界,飞指针是硬伤。代码量越大,出问题的概率越大。
: 这是不可改变的。跟OS无关。我觉得其实都可以建立概率模型。
: 现实项目的目标是控制这些问题的危害。而不是谋求没个地方都没问题。因为就算你现
: 在没问题了,下一个版本从头查也不现实。或者客户让你稍微定制一点,改一点,也无
: 法从头再查一次。
: <br>: c/c 是设计给懂os的人用的。所谓的坑都和系统有关。所为新语言的新
: 特性都
: 是把os
: ...................

g
guvest

你这个n从哪里来?是常数还是参数?计算出来的还是从IO读的?这事没那么简单。c99动态数组大多是人都弃用了
。你总不能说定标准的人都是无能之辈。另外第三方库还有大量的代码,问题会扩散的。网络送收什么的,buff多了去了。查起来不现实。
Golang slice也会内存泄漏。

【 在 netghost(Up to Isomorphism) 的大作中提到: 】
<br>: 你要怕越界,自己寫個buf,自帶一個長度,改get(x, n),set(x,n),總共10行
代碼,
<br>: 能有多大事?
<br>: 本來計算機就不知道什麼是界,你要硬性定義就是會造成某些事情幹不了。
<br>

x
xiaoju

他说的是在方法上消灭越界可能性。。。

你觉得自己改一下程序简单,但火星探测器着陆时来次越界,把你一起发射过去也得摔

用算法或者人力避免越界是停机问题不可解,唯一办法就是逻辑上取消越界的可能

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 你要怕越界,自己寫個buf,自帶一個長度,改get(x, n),set(x,n),總共10行代碼,
: 能有多大事?
: 本來計算機就不知道什麼是界,你要硬性定義就是會造成某些事情幹不了。

n
netghost

x[n] -> get(x,n)
x 改成結構自帶長度,alloc的時候把界寫進去。
所謂不讓你越界其實就是幹了這麼一件事,有什麼意思嗎。
【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 你这个n从哪里来?是常数还是参数?计算出来的还是从IO读的?这事没那么简单。
c99
: 动态数组大多是人都弃用了
: 。你总不能说定标准的人都是无能之辈。另外第三方库还有大量的代码,问题会扩散的
: 。网络送收什么的,buff多了去了。查起来不现实。
: Golang slice也会内存泄漏。
: <br>: 你要怕越界,自己寫個buf,自帶一個長度,改get(x, n),set(x,n),總
: 共10行
: 代碼,
: <br>: 能有多大事?
: <br>: 本來計算機就不知道什麼是界,你要硬性定義就是會造成某些事情幹不了。
: ...................

g
guvest

Golang的slice除了length,还有capacity。这个设计其实是不错的。但是C89标准没有
被推翻。有第三方库,问题仍然是很难避免的。这是一方面。另一方面,指针数组,多维指针数组什么的,上一层不出问题,下一层就不一定了。

【 在 netghost(Up to Isomorphism) 的大作中提到: 】
<br>: x[n] -

x
xiaoju

C的一维数组就是buffer,多维数组从一开始就是闭门造车错误设计

实际上需要的是,列表,容器,matlab数组对象,解析buffer的结构体

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: Golang的slice除了length,还有capacity。这个设计其实是不错的。但是C89标准没有
: 被推翻。有第三方库,问题仍然是很难避免的。这是一方面。另一方面,指针数组,多
: 维指针数组什么的,上一层不出问题,下一层就不一定了。
:
: x[n] -

n
netghost

有capacity就是再加一個成員,多大個事嗎?go那個設計無數C的庫都是這麼搞的,一
般經驗多點的C程序員也是這麼幹的。

指針數組,數組的地方仍然是數組。多維數組都可以變成i*ncol+j來尋址的一維數組,我是不懂這東西麻煩在哪裏。

golang省事的地方主要是它猥瑣地用了gc,which C/C++是不自帶的。(你要想用也有
)。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: Golang的slice除了length,还有capacity。这个设计其实是不错的。但是C89标准没有
: 被推翻。有第三方库,问题仍然是很难避免的。这是一方面。另一方面,指针数组,多
: 维指针数组什么的,上一层不出问题,下一层就不一定了。
: <br>: x[n] -

T
TeacherWei

我原文说了30行。不服的话咱们定个赌局呗,我做出来你彻底滚出mitbbs么?
前提是30行代码是我的,其它的都是第三方的开源库,include不算行数。

【 在 xiaoju(可爱的龙猫) 的大作中提到: 】

: 你贴10行代码很难么?

m
magagop

我很奇怪,filehandle和clone process應該是OS設計的鍋,不應該Cpp語言背。

【 在 TeacherWei(TW) 的大作中提到: 】

: 毛病多了去了,比如C STL fstream会leak file descriptors.

: 打开一个文件,然后立刻开child process。然后这个文件handle就会永久leak
到child

: process里面。

: 这就是开文件时候没设置O_CLOEXEC。当然和老kernel不支持也有一定关系。那
都是10

: 多年的老kernel了。C 20也是一个鸟样。因此对于我来讲fstream永久不可用。当然对

: 于别人可能是另外的情况。

: 这些,永远不会有人告诉你。你要先带着问题去找答案,还不是很容易能找到。
: reentrant

m
magagop

你確定你用過AWS?你確定AWS的VM支持幾TB物理內存?哪款CPU、什麼VM?我記得只有
HANA系統有12TB內存。普通的VM沒有那麼多物理內存。

【 在 nayinian(那一年) 的大作中提到: 】

: 现在内存还是个事吗?cloud 里的vm几秒钟给你调到几千个G.

m
magagop

這個我也不懂,Hadoop不是Java寫的?那不就是處理大數據的

【 在 pptwo(pp) 的大作中提到: 】

: JDK连个大数组都不支持,写Unsafe跟写C没啥区别。

: reentrant

m
magagop

還真不是,Cpp編譯慢,但運行飛快,不比C差,我沒看到誰用匯編寫的,那個不好移植。

【 在 xiaoju(可爱的龙猫) 的大作中提到: 】

: RTOS的应用领域太小了,就算是真要实时,也得躲开C 防止反应堆爆炸汽车刹
不住车

: Cpp14

T
TeacherWei

这有什么奇怪的?你设计一个标准库是要给人家用的。
现在别人不可用。而且更恶劣的是不但不可用,而且还有一个大坑!
这个锅,谁来背合适?

【 在 magagop (magagop) 的大作中提到: 】
: 我很奇怪,filehandle和clone process應該是OS設計的鍋,不應該Cpp語言背。
:
: 毛病多了去了,比如C STL fstream会leak file descriptors.
:
: 打开一个文件,然后立刻开child process。然后这个文件handle就会永久
leak
: 到child
:
: process里面。
:
: 这就是开文件时候没设置O_CLOEXEC。当然和老kernel不支持也有一定关系。那
: 都是10
:
: 多年的老kernel了。C 20也是一个鸟样。因此对于我来讲fstream永久不可用。
: 当然对
:
: 于别人可能是另外的情况。
: ...................

n
netghost

還是這個問題,取決你理解fork/exec這兩個系統調用的目的是什麼。
again,這個問題和你用的是C/C++, python, Java都無關。

【 在 magagop (magagop) 的大作中提到: 】
: 我很奇怪,filehandle和clone process應該是OS設計的鍋,不應該Cpp語言背。
:
: 毛病多了去了,比如C STL fstream会leak file descriptors.
:
: 打开一个文件,然后立刻开child process。然后这个文件handle就会永久
leak
: 到child
:
: process里面。
:
: 这就是开文件时候没设置O_CLOEXEC。当然和老kernel不支持也有一定关系。那
: 都是10
:
: 多年的老kernel了。C 20也是一个鸟样。因此对于我来讲fstream永久不可用。
: 当然对
:
: 于别人可能是另外的情况。
: ...................

m
magagop

感覺明顯應該是Linux那幫人背鍋啊,fork/clone/exec/close根本不是C語言的範疇。
Windows有這種問題嗎?AIX有麼?是不是只有Linux有?
另外Java也沒解決,Java的JVM可以fork另外一個JVM嗎?

【 在 TeacherWei (TW) 的大作中提到: 】
: 这有什么奇怪的?你设计一个标准库是要给人家用的。
: 现在别人不可用。而且更恶劣的是不但不可用,而且还有一个大坑!
: 这个锅,谁来背合适?
: leak

T
TeacherWei

没人给你背锅。作为设计者,傻逼的永远是自己,而不是用户。

任何人要设计一个fstream给用户用,不会leak是最起码的要求。扯任何别的那是纯属
不要脸。

Java当然也有runtime exec。虽然这方面我不熟悉,但是我不认为Java需要用户在exec前关闭所有文件。或者不关闭会有leak。

这根本不是技术问题,是起码的逻辑和人性有没有丧失的问题。

【 在 magagop (magagop) 的大作中提到: 】
: 感覺明顯應該是Linux那幫人背鍋啊,fork/clone/exec/close根本不是C語言的範疇。
: Windows有這種問題嗎?AIX有麼?是不是只有Linux有?
: 另外Java也沒解決,Java的JVM可以fork另外一個JVM嗎?

x
xiaoju

很多领域为了防止C++码农作死,宁可搞个简单的DSL一样高度优化。

【 在 magagop (magagop) 的大作中提到: 】
: 還真不是,Cpp編譯慢,但咝酗w快,不比C差,我沒看到誰用匯編寫的,那個不好移
植。

x
xiaoju

我同意这个观点

【 在 TeacherWei (TW) 的大作中提到: 】
: 这有什么奇怪的?你设计一个标准库是要给人家用的。
: 现在别人不可用。而且更恶劣的是不但不可用,而且还有一个大坑!
: 这个锅,谁来背合适?
: leak

x
xiaoju

能不能不要扯淡,既然要写肯定是标准库

否则你自己写个库,传入一个文件名返回sha256就无敌了

【 在 TeacherWei (TW) 的大作中提到: 】
: 标 题: Re: C/Cpp内存管理没那么难
: 发信站: BBS 未名空间站 (Sat May 16 05:42:32 2020, 美东)
:
: 我原文说了30行。不服的话咱们定个赌局呗,我做出来你彻底滚出mitbbs么?
: 前提是30行代码是我的,其它的都是第三方的开源库,include不算行数。
:
:
: 【 在 xiaoju(可爱的龙猫) 的大作中提到: 】
:
: 你贴10行代码很难么?
:

: --