两个指针还是一个指针+size_t?[关闭]


我正在做一个需要和指针一起工作的库,我遇到了一个重要的设计选择。假设我有一个函数 do_stuff 的函数,需要在指针上工作。有两种方法可以定义这样的函数 1) void do_stuff(T* first, T* last) 2) void do_stuff(T* ptr, size_t count) 哪儿 T 命名一个对象类型。第一个选项允许更快的迭代。这段代码

for(; first < last; ++first)
    do_stuff_impl(*first);

只需要做一个检查(first < last),以及一个加法(first + sizeof(T))每循环一次,而

for(size_t i = 0; i < count; ++i)
    do_stuff_impl(ptr[i]);

也要计算我们要引用的对象的地址,所以多了一条指令(ptr + i * sizeof(T))每个周期。在速度、空间效率和便携性方面,我是否有其他原因应该选择第一种方案而不是第二种方案(或者反之亦然)?编辑:忘了说明,第二个选项也需要多几个字节来容纳一个新的文件。size_t 编辑2:这个问题完全不是基于意见,我不是在问我应该用什么的意见(第一个比第二个看起来更好),我是在问事实……

解决方案:

Size的优点是,不可能不小心把两个不相关的指针传给函数。当然,还是有可能传错大小,但第二个参数是相对的而不是绝对的,这使得这种方法更简单。

如果我们把问题泛化到所有的迭代器,那么对迭代器的优点是,给定任意范围的未知大小,就不需要计算距离,这对于非随机访问迭代器来说,会有线性复杂度,而对于非前向迭代器来说,则不是一个选择。

这些选择之间的差别非常微妙,其中一个并不是毫不含糊地比另一个好。

标准库使用的是对迭代器与标准算法,而它使用的是指针+大小与 std::span 和一些字符串构造函数。

我的结论是 对迭代器有利于通用性,而指针和大小则有利于简化,当通用性不需要甚至不可能时。


需要注意的是,自己写对指针变体是没有必要的,因为标准库中已经有了一种算法,它完全可以做到这一点。std::for_each.


请注意,一旦引入通用性,就有第三个选择:传递一个代表范围的单一对象(通过引用)。我推荐这种方法。

给TA打赏
共{{data.count}}人
人已打赏
未分类

光子:重回房间

2022-11-13 21:16:19

未分类

Ingress serviceName更新后,如何应用变换器插件?

2022-11-13 21:16:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索