gpt4 book ai didi

c++ - 在 C/C++ 中使用堆栈进行内存管理时的编码风格

转载 作者:太空狗 更新时间:2023-10-29 23:42:04 24 4
gpt4 key购买 nike

我有 Java 背景,正在尝试学习如何以最简单的方式在 C/C++ 中处理内存(取消)分配。

同事建议我只给成员变量分配内存,让栈来处理局部变量。我不完全确定这个概念叫什么,但这意味着函数将像这样实现:

void inc(int x, int &y){
y=x+1;
}

另一种方式是这样的:

int inc(int x, int &y){
y=x+1;
return y;
}

第一个禁止我在表达式中使用它,即:

int y;
inc(2,y);
inc(y,y);

第二个是,但不是很漂亮:

int y;
y=inc(inc(2,y),y);

在我搞砸我的代码之前,经验丰富的 C/C++ 程序员如何看待这种编码风格?

最佳答案

我会强烈反对

int inc(int x, int &y) {
y=x+1;
return y;
}

对于使用这个函数的程序员来说,不清楚为什么函数修改输入并返回值,它们都是同一个对象


真的,在我看来,选择是:

// #1
void inc(int x, int& y) {
y=x+1;
}

int y = 0;
inc(2, y);

// #2
int inc(int x) {
return x+1;
}

int y = inc(2);

在一般情况下,我仍然更喜欢 #2,因为我发现“输出参数”陈旧且使用起来笨拙。正如您所指出的,您最终会在表达式上苦苦挣扎,并且在您调用函数1 时实际发生了什么并不是很清楚。

话又说回来,如果你有一个比 int 更复杂的对象(比如,一个数组,或一个大类,或者你只想“返回”多个对象),它可能会使如果您不在函数内创建任何新对象,则对象所有权更容易处理,使 #1 成为更方便的选择。

我想我想在这里得出的结论是,它取决于场景。试图概括这些事情是徒劳的。


1 - 使用指针而不是引用在一定程度上解决了这个问题,尽管它确实引入了膨胀,现在不得不费心检查无效指针:

// #3
void inc(int x, int* y) {
assert(y); // at least, we can check that it's not NULL
*y = x+1;
}

int y = 0;
inc(2, &y); // clear here that I'm passing a pointer

关于c++ - 在 C/C++ 中使用堆栈进行内存管理时的编码风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6088491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com