c*******v 发帖数: 2599 | 1 讨论下具体的东西吧. ANSI C.
[1]
malloc(ptr2X)
updateX(ptr2X,...)
free(ptr2X)
[2]
ptr2X=calcX(...) //malloc internally
free(ptr2X)
两个写法,各种语言都很常见。大家prefer哪个?
看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
第二种描述性好。但是其malloc在calcX里面一层。
然而多数情况下,函数call都多于一层。再加上if else,异常处理等干扰。
第一种写法下,导致free很难写在同一括号层。优点不存在,反而丧失了描述性。
这问题没有统一的答案。写波音飞机传感器的,和写message queue的
不可能是一个写法。我想听听大家的看法。我多数都用第一个写法。
目的就是一个,减少软件crash的机会到最少。 |
s****r 发帖数: 68 | 2 啥环境?
C++的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。 |
n******t 发帖数: 4406 | 3 看你的calcX裏面的事情有多少了。
但是很多時候你並沒有什麼選擇,只能是第二種。
【在 c*******v 的大作中提到】 : 讨论下具体的东西吧. ANSI C. : [1] : malloc(ptr2X) : updateX(ptr2X,...) : free(ptr2X) : [2] : ptr2X=calcX(...) //malloc internally : free(ptr2X) : 两个写法,各种语言都很常见。大家prefer哪个? : 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
|
c*******v 发帖数: 2599 | 4 Cpp我会看不会写。不过我看别人的代码。
Cpp也有好多函数内传指针,函数外传指针。这两者也有区别吧?
: 啥环境?
: C 的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。
【在 s****r 的大作中提到】 : 啥环境? : C++的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。
|
c*******v 发帖数: 2599 | 5 如果可能。我尽可能写第一种。
: 看你的calcX裏面的事情有多少了。
: 但是很多時候你並沒有什麼選擇,只能是第二種。
【在 n******t 的大作中提到】 : 看你的calcX裏面的事情有多少了。 : 但是很多時候你並沒有什麼選擇,只能是第二種。
|
w***g 发帖数: 5958 | 6 前阵子刚跟我司程序员讨论这事。我的代码里几乎看
不到第二种情况的。但是程序员就发现有的情况下第
二种情况不可避免。我认为是顶层设计经验问题。
老鸟的顶层设计一般都是对称的,不会出现2这种
情况。
【在 c*******v 的大作中提到】 : 讨论下具体的东西吧. ANSI C. : [1] : malloc(ptr2X) : updateX(ptr2X,...) : free(ptr2X) : [2] : ptr2X=calcX(...) //malloc internally : free(ptr2X) : 两个写法,各种语言都很常见。大家prefer哪个? : 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
|
n******t 发帖数: 4406 | 7 能讓你在同一個block裏面malloc同時還free的情況,現在並不是很多了。
【在 c*******v 的大作中提到】 : 如果可能。我尽可能写第一种。 : : : 看你的calcX裏面的事情有多少了。 : : 但是很多時候你並沒有什麼選擇,只能是第二種。 :
|
c*******v 发帖数: 2599 | 8 很多人都是和我和wdong类似,尽可能用第一种。
For that purpose, I often used extra variables and designed extra utility
functions.
【在 n******t 的大作中提到】 : 能讓你在同一個block裏面malloc同時還free的情況,現在並不是很多了。
|
s****r 发帖数: 68 | 9 RAII pattern, 基本思路差不多: https://en.wikipedia.org/wiki/Resource_
acquisition_is_initialization
在C里面,有人用goto 实现。
unique_p = malloc(xxx);
if (...) goto cleanup;
if (!Process(unique_p)) goto cleanup;
cleanup:
free(unique_p);
MoreCleanup();
第二种大概像下面?
void* Produce() {
unique_p = malloc();
...
if (!condition) {
goto cleanup;
return nullptr;
}
...
return unique_p;
}
unique_p = Produce();
if (unique_p) Process(unique_p);
cleanup:
free(unique_p);
MoreCleanup();
当然,如果只有free ptr的话,这个pattern就有点overkilling。
【在 c*******v 的大作中提到】 : Cpp我会看不会写。不过我看别人的代码。 : Cpp也有好多函数内传指针,函数外传指针。这两者也有区别吧? : : : 啥环境? : : C 的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。 :
|
n******t 发帖数: 4406 | 10 如果就這點要求,你要gc幹嘛?完全沒point。
【在 c*******v 的大作中提到】 : 很多人都是和我和wdong类似,尽可能用第一种。 : For that purpose, I often used extra variables and designed extra utility : functions.
|
|
|
T********i 发帖数: 2416 | 11 C++最有用的就是RAII了。
只用RAII和简单的class封装,就足够强大了。
基本上,你可以做到每10万行代码,alloc和free控制再20-30个以内。
简单搜索就能搜索到所有的alloc代码行,一目了然。
当然, C++的边界检查是不强制的。但是memory leak要杜绝还是很容易的。 |
l*******m 发帖数: 1096 | 12 第二种code review过不了吧。写函数的和用函数一般不是一个人,清理别人产生的内
存至少还要读别人的code,清理自己要简单多了
:很多人都是和我和wdong类似,尽可能用第一种。
:For that purpose, I often used extra variables and designed extra utility |
c*******v 发帖数: 2599 | 13 You have no idea about the development cost. In many cases, the development
cost of Golang is much cheaper than C.
【在 n******t 的大作中提到】 : 如果就這點要求,你要gc幹嘛?完全沒point。
|
c*******v 发帖数: 2599 | 14 Make sense
我遇到过的主要例外麻烦之一是概念分层。这个是为了语义方便。例如一组信号,分成
domain-group-channel-sensorID 这样四层。为了语义方便,每一层必然是单独一块
内存buff。然后你有10个domain,那就很多malloc,free。
你要是一个domain一块内存,那就只有10块buff,但是要做地址arithmatic才好找到下
一层。
【在 T********i 的大作中提到】 : C++最有用的就是RAII了。 : 只用RAII和简单的class封装,就足够强大了。 : 基本上,你可以做到每10万行代码,alloc和free控制再20-30个以内。 : 简单搜索就能搜索到所有的alloc代码行,一目了然。 : 当然, C++的边界检查是不强制的。但是memory leak要杜绝还是很容易的。
|
n******t 发帖数: 4406 | 15 你是老網友,沒必要跳腳說別人have no idea about xxx。
我認爲,development和程序語言沒關係,但是和你招人的mentality和找到的人有關係。
你去找golang的人,還是寫C的人,還是寫Java的人,如果腦子不清楚,都是死路一條。
更嚴重的是,如果你企圖用某種hype語言的某個特性,來讓你找到的漿糊程序員也能
出活,沒什麼要求的大路貨程序,maybe OK,稍微有點要求的,都是病急亂投醫。
你這個要求,C開發人員都知道怎麼處理。這個處理不好的人,2000行以上的程序不要說
沒bug,連跑通都是不可能的。
而且實在不想處理這麼件小事,也沒問題。
大部分C編譯器N年前都支持defer(就是一堆人奉爲神明的RAII),一堆project在用,
你自己不願意知道而已。
development
【在 c*******v 的大作中提到】 : You have no idea about the development cost. In many cases, the development : cost of Golang is much cheaper than C.
|
c*******v 发帖数: 2599 | 16 (1)
日常任务,golang,java好多情况下,也比C开发起来快很多倍。压根到不了你说的脑
子糊涂与否那一级呢。我说的是engineering 方面。
windows桌面程序,几个button,check box啥的,画一两个图。C开发起来也慢很多。
GUI本身C弄起来就很麻烦。你要写过win32 C程序,就知道我在说啥。
(2)
我不知道啥叫RAII。malloc,free尽量放一层这个rule,是我自己总结的。
我觉得不是100%对等。
係。
條。
要說
【在 n******t 的大作中提到】 : 你是老網友,沒必要跳腳說別人have no idea about xxx。 : 我認爲,development和程序語言沒關係,但是和你招人的mentality和找到的人有關係。 : 你去找golang的人,還是寫C的人,還是寫Java的人,如果腦子不清楚,都是死路一條。 : 更嚴重的是,如果你企圖用某種hype語言的某個特性,來讓你找到的漿糊程序員也能 : 出活,沒什麼要求的大路貨程序,maybe OK,稍微有點要求的,都是病急亂投醫。 : 你這個要求,C開發人員都知道怎麼處理。這個處理不好的人,2000行以上的程序不要說 : 沒bug,連跑通都是不可能的。 : 而且實在不想處理這麼件小事,也沒問題。 : 大部分C編譯器N年前都支持defer(就是一堆人奉爲神明的RAII),一堆project在用, : 你自己不願意知道而已。
|
g*****y 发帖数: 7271 | 17 我自己的code从来不用第二种。
有时候有人觉得不得不用第二种,比方说在外层不知道该分配多大空间之类的。
我觉得应该先在外层分配个default大小的空间,内部可以重新resize成需要
的大小。但是最后还是在外层去释放。
【在 c*******v 的大作中提到】 : 很多人都是和我和wdong类似,尽可能用第一种。 : For that purpose, I often used extra variables and designed extra utility : functions.
|
c*******v 发帖数: 2599 | 18 第二种的好处是不会忘记数学公式。
各种论文伪代码的algorithm,绝大多数都是第二种。
另外确有不得不用第二种的情况。
假如你要N个size_t.
if else,setjump抓corner case啥的进来干扰N的计算值,resize会很麻烦。
还是设计时候要想好。
【在 g*****y 的大作中提到】 : 我自己的code从来不用第二种。 : 有时候有人觉得不得不用第二种,比方说在外层不知道该分配多大空间之类的。 : 我觉得应该先在外层分配个default大小的空间,内部可以重新resize成需要 : 的大小。但是最后还是在外层去释放。
|
M********t 发帖数: 5032 | 19 第二种改个名字好了
getXXX
retXXX |
g*****y 发帖数: 7271 | 20 updateX(ptr2X,...) 和 ptr2X = calX()
的区别其实就是updateX在重新分配空间时,需要处理本来ptr2X
指向的区间的一致性,包括有异常的时候别把原来ptr2X搞乱等等。
而calX把这件事丢给别人做了。就像realloc和malloc的区别。
调用realloc不需要和free成对出现,但是调用malloc需要有
很多book keeping 或者成对的free,所以更难用对。
写realloc的人写code需要多做些book keeping的事情。
而malloc则是用它的人需要多做很多事情。好用的库需要尽量
少设计和添加malloc这样的函数。
【在 c*******v 的大作中提到】 : 第二种的好处是不会忘记数学公式。 : 各种论文伪代码的algorithm,绝大多数都是第二种。 : 另外确有不得不用第二种的情况。 : 假如你要N个size_t. : if else,setjump抓corner case啥的进来干扰N的计算值,resize会很麻烦。 : 还是设计时候要想好。
|
|
|
a*****g 发帖数: 19398 | 21 有很多监控内存占用和释放的中间模块了
【在 c*******v 的大作中提到】 : 讨论下具体的东西吧. ANSI C. : [1] : malloc(ptr2X) : updateX(ptr2X,...) : free(ptr2X) : [2] : ptr2X=calcX(...) //malloc internally : free(ptr2X) : 两个写法,各种语言都很常见。大家prefer哪个? : 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
|
c*******v 发帖数: 2599 | 22 Fixed coding habit and style is still invaluable.
【在 a*****g 的大作中提到】 : 有很多监控内存占用和释放的中间模块了
|
n******t 发帖数: 4406 | 23 1) exactly寫過win32 GUI的人會知道win32 api好用。
GUI開發的最重要的是有個好的IDE。
2) 不知道也沒啥。不過就這個事情,你既然總結了,很難嗎?
【在 c*******v 的大作中提到】 : (1) : 日常任务,golang,java好多情况下,也比C开发起来快很多倍。压根到不了你说的脑 : 子糊涂与否那一级呢。我说的是engineering 方面。 : windows桌面程序,几个button,check box啥的,画一两个图。C开发起来也慢很多。 : GUI本身C弄起来就很麻烦。你要写过win32 C程序,就知道我在说啥。 : (2) : 我不知道啥叫RAII。malloc,free尽量放一层这个rule,是我自己总结的。 : 我觉得不是100%对等。 : : 係。
|
b*******s 发帖数: 5216 | 24 第二种除了类厂,不应该出现
【在 w***g 的大作中提到】 : 前阵子刚跟我司程序员讨论这事。我的代码里几乎看 : 不到第二种情况的。但是程序员就发现有的情况下第 : 二种情况不可避免。我认为是顶层设计经验问题。 : 老鸟的顶层设计一般都是对称的,不会出现2这种 : 情况。
|
b*******s 发帖数: 5216 | 25 内存池就这样设计的,一个统一空间,然后各个尺寸和归属各个cpu的子池向统一的申
请,这样做快而且容易做到线程安全
【在 g*****y 的大作中提到】 : 我自己的code从来不用第二种。 : 有时候有人觉得不得不用第二种,比方说在外层不知道该分配多大空间之类的。 : 我觉得应该先在外层分配个default大小的空间,内部可以重新resize成需要 : 的大小。但是最后还是在外层去释放。
|
a*****g 发帖数: 19398 | 26 是。两个事情不矛盾。大部分人只知道你说的那部分。
【在 c*******v 的大作中提到】 : Fixed coding habit and style is still invaluable.
|
x****u 发帖数: 44466 | 27 手写内存分配,一行要罚款$50,作为风险公积金
【在 c*******v 的大作中提到】 : 讨论下具体的东西吧. ANSI C. : [1] : malloc(ptr2X) : updateX(ptr2X,...) : free(ptr2X) : [2] : ptr2X=calcX(...) //malloc internally : free(ptr2X) : 两个写法,各种语言都很常见。大家prefer哪个? : 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
|
x****u 发帖数: 44466 | 28 RAII也有巨多的坑
我知道一堆办法可以一个new不写也泄露内存
【在 T********i 的大作中提到】 : C++最有用的就是RAII了。 : 只用RAII和简单的class封装,就足够强大了。 : 基本上,你可以做到每10万行代码,alloc和free控制再20-30个以内。 : 简单搜索就能搜索到所有的alloc代码行,一目了然。 : 当然, C++的边界检查是不强制的。但是memory leak要杜绝还是很容易的。
|
p*u 发帖数: 2454 | 29 我除了strdup就不知道啥了。
【在 x****u 的大作中提到】 : RAII也有巨多的坑 : 我知道一堆办法可以一个new不写也泄露内存
|
x****u 发帖数: 44466 | 30 这种不算
单线程,只使用STL标准容器也可以泄露内存
【在 p*u 的大作中提到】 : 我除了strdup就不知道啥了。
|
|
|
x****u 发帖数: 44466 | 31 win32 api好用?
出道基础题,给对话框的text改个字体,good luck!
【在 n******t 的大作中提到】 : 1) exactly寫過win32 GUI的人會知道win32 api好用。 : GUI開發的最重要的是有個好的IDE。 : 2) 不知道也沒啥。不過就這個事情,你既然總結了,很難嗎?
|