VS灵异事件

1.曾经有一段时间,我的VS只有Debug能有五颜六色的自动编译,后来我的VS反倒只有Release能呈现五颜六色态。
只有在这个彩色态下,才能使用Find/F12等操作,不在彩色态下时,甚至连MFC添加按钮的点击事件都会显示拒绝访问。
有一种不完全解决的方式,认为是项目过大导致某种缓存溢出了,需要去C:\Users\< your users name>\AppData\Local\Microsoft\VisualStudio\12.0\ComponentModelCache文件夹下删除所有文件及文件夹;但是这种方法好像只能修复Debug模式下的智能编译提示。

2.为什么向vector中pushback另一个vector,里面的值都没了?
当我们向一些类似vector的容器中,存入元素时,底层会自动复制一份一样的元素,存入容器,这一点可以通过观察容器内元素的地址得出。
问题在于,如果我们在对应容器/对象的类中,自己写了一个复制该对象的构造函数,那系统就很有可能去调用这个函数,而不做自动的复制。
这将会导致,如果我们在这个构造函数中犯了错,少复制了一些元素,这些元素在对vector执行pushback的时候,就会直接被重置,刷新到系统默认值,这样一来就造成了数据在pushback时丢失的假象。
以CTransform类为例,如果你写了这样的一个构造函数:
CTransform::CTransform(const CTransform &other)
{
    属性a=other.属性a;
}
那么在pushback时就只有属性a会被传递进vector,个人感觉这类函数还是少用为妙,很难排查。
如果你要过滤掉一些属性,也不一定非要采用这种容易造成其它同事修半天找不到原因的方式。
顺带一提,在vector的pushback中有浅拷贝与深拷贝的概念,前者似乎是拷贝了地址,后者似乎是完全拷贝了一份新的数据。
有大佬调查过push_back 对于内存的控制,具体如下:
vector 每次调用 push_back 时都会拷贝一个新的参数指定的 sss 类对象,这会调用 sss 的拷贝构造函数,第一次的 copy 正常,而且 vector 的实际容量也由 0  变为 1。
第二次调用 push_back,通过输出会发现调用了两次拷贝构造函数,一次析构函数,原来 vector 此时判断容量不够,将容量扩大为原来的两倍,变为 2,并将原来的元素再次拷贝一份存放到新的内存空间,然后拷贝新加的类对象,最后再释放原来的元素。
第三次调用 push_back 时,vector 自动扩大为4,因此拷贝构造函数调用了3次,析构函数调用了2次,程序最终退出了时就析构了 5 次加本身的 sss 类对象一共 6 次。
这样设计的主要目的据说是为了减小时间复杂度;如果每次都按实际的大小来增加 vector 的空间,会造成时间复杂度很高,降低 push_back 的速度。
实际上调用copy的是vector的insert函数,但是pushback函数末尾居然也调用了insert,导致了这一现象的发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值