讨论下具体的东西吧

c
chebyshev
楼主 (未名空间)

讨论下具体的东西吧. 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
skyeer

啥环境?

C++的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。

n
netghost

看你的calcX裏面的事情有多少了。

但是很多時候你並沒有什麼選擇,只能是第二種。
【 在 chebyshev (......) 的大作中提到: 】
: 讨论下具体的东西吧.
: [1]
: malloc(ptr2X)
: updateX(ptr2X,...)
: free(ptr2X)
: [2]
: ptr2X=calcX(...) //malloc internally
: free(ptr2X)
: 两个写法,各种语言都很常见。大家prefer哪个?
: 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
: ...................

c
chebyshev

Cpp我会看不会写。不过我看别人的代码。
Cpp也有好多函数内传指针,函数外传指针。这两者也有区别吧?

【 在 skyeer(看到你的眼) 的大作中提到: 】

: 啥环境?

: C 的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。

c
chebyshev

如果可能。我尽可能写第一种。

【 在 netghost(Up to Isomorphism) 的大作中提到: 】

: 看你的calcX裏面的事情有多少了。

: 但是很多時候你並沒有什麼選擇,只能是第二種。

w
wdong

前阵子刚跟我司程序员讨论这事。我的代码里几乎看
不到第二种情况的。但是程序员就发现有的情况下第
二种情况不可避免。我认为是顶层设计经验问题。
老鸟的顶层设计一般都是对称的,不会出现2这种
情况。

【 在 chebyshev (......) 的大作中提到: 】
: 讨论下具体的东西吧. ANSI C.
: [1]
: malloc(ptr2X)
: updateX(ptr2X,...)
: free(ptr2X)
: [2]
: ptr2X=calcX(...) //malloc internally
: free(ptr2X)
: 两个写法,各种语言都很常见。大家prefer哪个?
: 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
: ...................

n
netghost

能讓你在同一個block裏面malloc同時還free的情況,現在並不是很多了。
【 在 chebyshev (......) 的大作中提到: 】
: 如果可能。我尽可能写第一种。
:
: 看你的calcX裏面的事情有多少了。
:
: 但是很多時候你並沒有什麼選擇,只能是第二種。
:

c
chebyshev

很多人都是和我和wdong类似,尽可能用第一种。
For that purpose, I often used extra variables and designed extra utility
functions.

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 能讓你在同一個block裏面malloc同時還free的情況,現在並不是很多了。

s
skyeer

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。

【 在 chebyshev (......) 的大作中提到: 】
: Cpp我会看不会写。不过我看别人的代码。
: Cpp也有好多函数内传指针,函数外传指针。这两者也有区别吧?
:
: 啥环境?
:
: C 的话,先考虑unique_ptr吧。或者所有OO语言,都有类似的。
:

n
netghost

如果就這點要求,你要gc幹嘛?完全沒point。

【 在 chebyshev (......) 的大作中提到: 】
: 很多人都是和我和wdong类似,尽可能用第一种。
: For that purpose, I often used extra variables and designed extra utility : functions.

T
TeacherWei

C++最有用的就是RAII了。
只用RAII和简单的class封装,就足够强大了。
基本上,你可以做到每10万行代码,alloc和free控制再20-30个以内。
简单搜索就能搜索到所有的alloc代码行,一目了然。
当然, C++的边界检查是不强制的。但是memory leak要杜绝还是很容易的。
l
lightroom

第二种code review过不了吧。写函数的和用函数一般不是一个人,清理别人产生的内
存至少还要读别人的code,清理自己要简单多了

【在 chebyshev(......)的大作中提到:】
:很多人都是和我和wdong类似,尽可能用第一种。
:For that purpose, I often used extra variables and designed extra utility

c
chebyshev

You have no idea about the development cost. In many cases, the development cost of Golang is much cheaper than C.

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 如果就這點要求,你要gc幹嘛?完全沒point。

c
chebyshev

Make sense

我遇到过的主要例外麻烦之一是概念分层。这个是为了语义方便。例如一组信号,分成domain-group-channel-sensorID 这样四层。为了语义方便,每一层必然是单独一块内存buff。然后你有10个domain,那就很多malloc,free。

你要是一个domain一块内存,那就只有10块buff,但是要做地址arithmatic才好找到下一层。
【 在 TeacherWei (TW) 的大作中提到: 】
: C++最有用的就是RAII了。
: 只用RAII和简单的class封装,就足够强大了。
: 基本上,你可以做到每10万行代码,alloc和free控制再20-30个以内。
: 简单搜索就能搜索到所有的alloc代码行,一目了然。
: 当然, C++的边界检查是不强制的。但是memory leak要杜绝还是很容易的。

n
netghost

你是老網友,沒必要跳腳說別人have no idea about xxx。
我認爲,development和程序語言沒關係,但是和你招人的mentality和找到的人有關係。

你去找golang的人,還是寫C的人,還是寫Java的人,如果腦子不清楚,都是死路一條。
更嚴重的是,如果你企圖用某種hype語言的某個特性,來讓你找到的漿糊程序員也能
出活,沒什麼要求的大路貨程序,maybe OK,稍微有點要求的,都是病急亂投醫。

你這個要求,C開發人員都知道怎麼處理。這個處理不好的人,2000行以上的程序不要說
沒bug,連跑通都是不可能的。

而且實在不想處理這麼件小事,也沒問題。
大部分C編譯器N年前都支持defer(就是一堆人奉爲神明的RAII),一堆project在用,
你自己不願意知道而已。

【 在 chebyshev (......) 的大作中提到: 】
: You have no idea about the development cost. In many cases, the
development
: cost of Golang is much cheaper than C.

c
chebyshev

(1)
日常任务,golang,java好多情况下,也比C开发起来快很多倍。压根到不了你说的脑
子糊涂与否那一级呢。我说的是engineering 方面。
windows桌面程序,几个button,check box啥的,画一两个图。C开发起来也慢很多。
GUI本身C弄起来就很麻烦。你要写过win32 C程序,就知道我在说啥。

(2)
我不知道啥叫RAII。malloc,free尽量放一层这个rule,是我自己总结的。
我觉得不是100%对等。
【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 你是老網友,沒必要跳腳說別人have no idea about xxx。
: 我認爲,development和程序語言沒關係,但是和你招人的mentality和找到的人有關係。
: 你去找golang的人,還是寫C的人,還是寫Java的人,如果腦子不清楚,都是死路一
條。
: 更嚴重的是,如果你企圖用某種hype語言的某個特性,來讓你找到的漿糊程序員也能: 出活,沒什麼要求的大路貨程序,maybe OK,稍微有點要求的,都是病急亂投醫。
: 你這個要求,C開發人員都知道怎麼處理。這個處理不好的人,2000行以上的程序不
要說
: 沒bug,連跑通都是不可能的。
: 而且實在不想處理這麼件小事,也沒問題。
: 大部分C編譯器N年前都支持defer(就是一堆人奉爲神明的RAII),一堆project在用,: 你自己不願意知道而已。
: ...................

g
gallery

我自己的code从来不用第二种。

有时候有人觉得不得不用第二种,比方说在外层不知道该分配多大空间之类的。
我觉得应该先在外层分配个default大小的空间,内部可以重新resize成需要
的大小。但是最后还是在外层去释放。

【 在 chebyshev (......) 的大作中提到: 】
: 很多人都是和我和wdong类似,尽可能用第一种。
: For that purpose, I often used extra variables and designed extra utility : functions.

c
chebyshev

第二种的好处是不会忘记数学公式。
各种论文伪代码的algorithm,绝大多数都是第二种。

另外确有不得不用第二种的情况。
假如你要N个size_t.
if else,setjump抓corner case啥的进来干扰N的计算值,resize会很麻烦。

还是设计时候要想好。
【 在 gallery (gallery) 的大作中提到: 】
: 我自己的code从来不用第二种。
: 有时候有人觉得不得不用第二种,比方说在外层不知道该分配多大空间之类的。
: 我觉得应该先在外层分配个default大小的空间,内部可以重新resize成需要
: 的大小。但是最后还是在外层去释放。

M
MaLaRabbit

第二种改个名字好了
getXXX
retXXX
g
gallery

updateX(ptr2X,...) 和 ptr2X = calX()

的区别其实就是updateX在重新分配空间时,需要处理本来ptr2X
指向的区间的一致性,包括有异常的时候别把原来ptr2X搞乱等等。

而calX把这件事丢给别人做了。就像realloc和malloc的区别。

调用realloc不需要和free成对出现,但是调用malloc需要有
很多book keeping 或者成对的free,所以更难用对。

写realloc的人写code需要多做些book keeping的事情。
而malloc则是用它的人需要多做很多事情。好用的库需要尽量
少设计和添加malloc这样的函数。

【 在 chebyshev (......) 的大作中提到: 】
: 第二种的好处是不会忘记数学公式。
: 各种论文伪代码的algorithm,绝大多数都是第二种。
: 另外确有不得不用第二种的情况。
: 假如你要N个size_t.
: if else,setjump抓corner case啥的进来干扰N的计算值,resize会很麻烦。
: 还是设计时候要想好。

a
ananpig

有很多监控内存占用和释放的中间模块了

【 在 chebyshev (......) 的大作中提到: 】
: 讨论下具体的东西吧. ANSI C.
: [1]
: malloc(ptr2X)
: updateX(ptr2X,...)
: free(ptr2X)
: [2]
: ptr2X=calcX(...) //malloc internally
: free(ptr2X)
: 两个写法,各种语言都很常见。大家prefer哪个?
: 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
: ...................

c
chebyshev

Fixed coding habit and style is still invaluable.

【 在 ananpig (别瞅 变态辣椒 漫画的●○安安猪) 的大作中提到: 】
: 有很多监控内存占用和释放的中间模块了

n
netghost

1) exactly寫過win32 GUI的人會知道win32 api好用。
GUI開發的最重要的是有個好的IDE。

2) 不知道也沒啥。不過就這個事情,你既然總結了,很難嗎?
【 在 chebyshev (......) 的大作中提到: 】
: (1)
: 日常任务,golang,java好多情况下,也比C开发起来快很多倍。压根到不了你说的脑
: 子糊涂与否那一级呢。我说的是engineering 方面。
: windows桌面程序,几个button,check box啥的,画一两个图。C开发起来也慢很多。
: GUI本身C弄起来就很麻烦。你要写过win32 C程序,就知道我在说啥。
: (2)
: 我不知道啥叫RAII。malloc,free尽量放一层这个rule,是我自己总结的。
: 我觉得不是100%对等。
: 係。
: 條。
: ...................

b
brainless

第二种除了类厂,不应该出现
【 在 wdong (万事休) 的大作中提到: 】
: 前阵子刚跟我司程序员讨论这事。我的代码里几乎看
: 不到第二种情况的。但是程序员就发现有的情况下第
: 二种情况不可避免。我认为是顶层设计经验问题。
: 老鸟的顶层设计一般都是对称的,不会出现2这种
: 情况。

b
brainless

内存池就这样设计的,一个统一空间,然后各个尺寸和归属各个cpu的子池向统一的申
请,这样做快而且容易做到线程安全
【 在 gallery (gallery) 的大作中提到: 】
: 我自己的code从来不用第二种。
: 有时候有人觉得不得不用第二种,比方说在外层不知道该分配多大空间之类的。
: 我觉得应该先在外层分配个default大小的空间,内部可以重新resize成需要
: 的大小。但是最后还是在外层去释放。

a
ananpig

是。两个事情不矛盾。大部分人只知道你说的那部分。

【 在 chebyshev (......) 的大作中提到: 】
: 标 题: Re: 讨论下具体的东西吧
: 发信站: BBS 未名空间站 (Mon Jan 20 15:33:59 2020, 美东)
:
: Fixed coding habit and style is still invaluable.
:
: 【 在 ananpig (别瞅 变态辣椒 漫画的●○安安猪) 的大作中提到: 】
: : 有很多监控内存占用和释放的中间模块了
:
:
:
: --
x
xiaoju

手写内存分配,一行要罚款$50,作为风险公积金

【 在 chebyshev (......) 的大作中提到: 】
: 讨论下具体的东西吧. ANSI C.
: [1]
: malloc(ptr2X)
: updateX(ptr2X,...)
: free(ptr2X)
: [2]
: ptr2X=calcX(...) //malloc internally
: free(ptr2X)
: 两个写法,各种语言都很常见。大家prefer哪个?
: 看上去第一种好,因为malloc和free在同一个括号层。不容易忘。
: ...................

x
xiaoju

RAII也有巨多的坑

我知道一堆办法可以一个new不写也泄露内存

【 在 TeacherWei (TW) 的大作中提到: 】
: C++最有用的就是RAII了。
: 只用RAII和简单的class封装,就足够强大了。
: 基本上,你可以做到每10万行代码,alloc和free控制再20-30个以内。
: 简单搜索就能搜索到所有的alloc代码行,一目了然。
: 当然, C++的边界检查是不强制的。但是memory leak要杜绝还是很容易的。

p
pxu

我除了strdup就不知道啥了。

【 在 xiaoju (可爱的龙猫) 的大作中提到: 】
: RAII也有巨多的坑
: 我知道一堆办法可以一个new不写也泄露内存

x
xiaoju

这种不算

单线程,只使用STL标准容器也可以泄露内存

【 在 pxu (又呱噪又抠门还偷老婆钱) 的大作中提到: 】
: 我除了strdup就不知道啥了。

x
xiaoju

win32 api好用?

出道基础题,给对话框的text改个字体,good luck!

【 在 netghost (Up to Isomorphism) 的大作中提到: 】
: 1) exactly寫過win32 GUI的人會知道win32 api好用。
: GUI開發的最重要的是有個好的IDE。
: 2) 不知道也沒啥。不過就這個事情,你既然總結了,很難嗎?