由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 讨论下具体的东西吧
相关主题
如果不用很高级的feature,C++/Scala是否值得一战?有大侠讲讲RTTI和exception的问题么?
[bssd]最近公司有人整我python和java里面非memory资源怎么回收?
golang為什麼語法和關鍵詞這麼冷門?谁给说说python里这个with statement有什么好处?
一个烂设计的实例SmartThings用gc的语言是不是就不能用RAII了?
size不固定的struct怎么定义呀?What is the side effect not to call sem_destroy()?
C语言的变量都一定要放在stack上吗?请问C++ exception后如何清理function stack上的内存资源?
就GUI来讲,哪个平台的GUI最好编?C++ 的 exception handling
几个问题C++的exception大家常用吗?
相关话题的讨论汇总
话题: malloc话题: ptr2x话题: unique话题: free话题: 第二种
进入Programming版参与讨论
1 (共1页)
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.

相关主题
就GUI来讲,哪个平台的GUI最好编?python和java里面非memory资源怎么回收?
几个问题谁给说说python里这个with statement有什么好处?
有大侠讲讲RTTI和exception的问题么?用gc的语言是不是就不能用RAII了?
进入Programming版参与讨论
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会很麻烦。
: 还是设计时候要想好。

相关主题
What is the side effect not to call sem_destroy()?C++的exception大家常用吗?
请问C++ exception后如何清理function stack上的内存资源?你们写过的最长的main函数有多长?
C++ 的 exception handling(zz)C++11新特性
进入Programming版参与讨论
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就不知道啥了。
相关主题
面试C/C++该怎么准备?[bssd]最近公司有人整我
一个Quant Developer的C++面试题golang為什麼語法和關鍵詞這麼冷門?
如果不用很高级的feature,C++/Scala是否值得一战?一个烂设计的实例SmartThings
进入Programming版参与讨论
x****u
发帖数: 44466
31
win32 api好用?
出道基础题,给对话框的text改个字体,good luck!

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

1 (共1页)
进入Programming版参与讨论
相关主题
你们写过的最长的main函数有多长?size不固定的struct怎么定义呀?
(zz)C++11新特性C语言的变量都一定要放在stack上吗?
面试C/C++该怎么准备?就GUI来讲,哪个平台的GUI最好编?
一个Quant Developer的C++面试题几个问题
如果不用很高级的feature,C++/Scala是否值得一战?有大侠讲讲RTTI和exception的问题么?
[bssd]最近公司有人整我python和java里面非memory资源怎么回收?
golang為什麼語法和關鍵詞這麼冷門?谁给说说python里这个with statement有什么好处?
一个烂设计的实例SmartThings用gc的语言是不是就不能用RAII了?
相关话题的讨论汇总
话题: malloc话题: ptr2x话题: unique话题: free话题: 第二种