对非POD类型使用git rev-list $tag..HEAD --count
是否安全?
例如,如果我std::realloc
一个STL容器数组,即使移动内容也不会成为问题,因为容器对象的所有成员(包括指向实际数据的指针)仍然存在那里。为每个元素调用复制构造函数是不是浪费,这可能会分配新的堆内存并复制所有内容,然后释放所有旧的内存块。例如,考虑调整realloc
的大小。
我错过了什么吗?
注意:当然,您很少在C ++中调用std::vector<std::vector<int>>
,但要考虑何时设计涉及调整大小的数据结构类。
答案 0 :(得分:3)
不,不安全。
对于你想象的更简单的东西,你可以逃脱它。
但想象一下使用类变量来跟踪每个对象位置的结构。现在你用realloc而不是构造函数和赋值运算符复制它,结构完全错误,因为代码违反了规则。
答案 1 :(得分:0)
当要求realloc
扩展已分配的区域时,它可以通过两种不同的方式取得成功:
realloc
可以某种方式扩展该区域,因此它会保留其地址但会变大。只要将新零件视为未初始化的存储空间,这就没有问题了。
realloc
可以分配合适的新区域,复制数据并解除分配原始区域。 问题1 :复制并不总是适合负责复制或移动的类型。 问题2:指针和对原始区域中对象的引用现在无效。
很容易想到它适用于非POD项目的情况,并且很容易想到它不起作用的情况。对于不工作而言可能是最简单的,链接结构的Node
类型,其中节点具有彼此的指针。
结果是人们可以获得真正的速度提升(例如,CPython使用realloc
进行字符串处理),但是std::vector
太过笼统,无法使用它。需要一些更专用的自定义容器。 AFAIK在Boost中没有这样的东西,但即使我没有听说过它也可能有。