我很难找到一个好的答案.出于某种原因,我认为STL排序将使用swap来实现,以便更好地支持复杂类型,但是当我最终挖掘代码时,它似乎实际上正在进行二进制复制.有人能证实吗?我猜二进制副本实际上更适合交换.
问题:是否使用交换实现了任何STL算法或容器操作?(std::swap显然在外面.)我想知道何时为复杂类型实现我自己的交换是谨慎的.
编辑:我问的原因是你是否有类似的东西:
class MyClass {
vector<int> vec_data;
int a;
int b;
}
vector<MyClass> my_vec;
sort(my_vec.begin(), my_vec.end(), MyCustomCompare);
Run Code Online (Sandbox Code Playgroud)
我想确保排序不是调用向量的复制构造函数,如果调用MyData的默认复制构造函数,就会发生这种情况.因此我的问题是排序调用交换,复制分配等?
有没有人对使用Chrome(V8)的Javascript中如何确定字符串的堆大小有很好的理解/解释?
我在堆转储中看到的一些示例:
1)具有不同@对象ID 的相同2个字符串(即"dt")的多个副本全部被指定为OneByteStrings.heapdump表示每个副本都有一个浅的&保留大小为32个字节.目前尚不清楚两个字节的字符串如何保留大小为32以及为什么字符串似乎没有被实现.
2)长对象路径字符串,长度为78个字符.所有字符都是utf8中的单个字节.它被归类为InternalizedString.它有一个184字节的保留大小.即使使用2字节字符编码仍然不能解释剩余的28个字节.为什么这些路径字符串占用了这么多空间?我可以想象另外4个字节(可能是8个)用于地址,另外4个用于存储字符串长度,但即使使用2个字节的字符编码,仍然会留下16个字节.
我试图查看新分配器的行为以及为什么它不会连续放置数据.
我的代码:
struct ci {
char c;
int i;
}
template <typename T>
void memTest()
{
T * pLast = new T();
for(int i = 0; i < 20; ++i) {
T * pNew = new T();
cout << (pNew - pLast) << " ";
pLast = pNew;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我用char,int,ci运行它.大多数分配是从最后一个固定长度,有时从一个可用块到另一个块有奇怪的跳跃.
sizeof(char):1
平均跳转:64字节
sizeof(int):4
平均跳跃:16
sizeof(ci):8(int必须放在4字节对齐上)
平均跳转:9
任何人都可以解释为什么分配器像这样分段内存?另外,为什么char的跳转比int和包含int和char的结构大得多.