微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候适合重新分配函数参数或返回指向新内存的指针?

如何解决什么时候适合重新分配函数参数或返回指向新内存的指针?

在查看<cstdio>的某些功能时,我看到了用于读取文件功能fread。据我了解,该函数仅从size * count读取stream个字节,并从ptr存储的地址开始连续写入相同的数量

size_t fread (void *ptr,size_t size,size_t count,FILE *stream );

在这种情况下,函数fread恰好返回读取的字节数,但是我很好奇它对ptr的第二影响,在我看来,这几乎是第二或替代输出

具体来说,以下哪种情况比另一种更好?为什么?

void function_modifying_parameter (int x,int &y /* or int *y */)
{
  y = 2 * x;
}
int * function_returning_pointer (int x)
{
  return new int (2 * x);
}

我已经考虑过每个人自己的一些可能优势。这是我的想法:

  • 返回指针似乎可以强制执行const的要求,而传递的指针或引用在离开函数后将返回其调用前的const的状态,从而使调用者有更大的自由来操纵输出
  • 传递指针或引用允许用户自行选择提供堆或堆栈变量,但是仅使用新的新指针指向堆是有意义的,因为函数的局部作用域将在调用后销毁。 / li>
  • 对我来说,返回指针更具可读性。在最简单的情况下,出于输出目的通过引用传递附加参数会增加标头长度。数组类型或其他需要使用其他信息的类型可能需要更多的参数。
  • 如果函数将被多次调用,并且有可能一遍又一遍地重新分配引用或指针参数,则重复使用a变量可以减少所需的delete语句的数量以及与其相关的错误滥用。

主要,我对一个人可以做的事情,另一个人不能做的事情以及何时一个人比另一个更好的目标感兴趣,其目的是编写更具可读性,有用和/或高效的代码

解决方法

在这两个中,第一个无疑更好。

如果您想比较更相似的东西,应该是:

extern "C" size_t modifying_function(size_t s,char* buffer) noexcept {
    ...
}

std::string allocating_function() {
    ...
}

第一个优点是不分配内存,也不使用任何复杂类型。这样,它将始终成功(即使只是通过返回更大的大小),也将使调用者可以使用自己的缓冲区。这是跨语言使用的理想选择。

第二个优点是返回一个非常适合使用的类型,并照顾所有缓冲区管理的细节。不幸的是,缓冲区管理可能会失败。

顺便说一句,特别是如果完成的工作更加复杂,并且可能存在其他语言的绑定,同时具有将缓冲区管理留给调用方的低级功能和一些高级功能并不少见使用它,并注意将其包装为更多的语义类型,同时注意资源管理。

auto allocating_function() {
    auto s = std::string().capacity();
    for (;;) {
        std::string r(s,'\0');
        s = modifying_function(r.size(),r.data());
        if (s > r.size())
            continue;
        r.resize(s);
        return r;
    }
}

现在allocating_function()也有一个变体,尝试重新使用以前使用的缓冲区,因为分配和释放通常很昂贵:

auto& reallocating_function(std::string& r) {
    for (;;) {
        auto s = modifying_function(r.size(),r.data());
        if (s <= r.size())
            break;
        r.resize(s);
    }
    r.resize(s);
    return r;
}

使用起来显然比较麻烦。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。