1.
频繁存取修改的变量,c中有个叫寄存器变量的好物。register声明只适用于函数参数和auto变量。但——寄存器变量是可以被编译忽略的。也就是说,通常没有多大必要在C++中使用它,除非是底层硬件编程。
2.
指针变量必须要有一个类型说明符。比如int* p,这样的声明才完整。
*表示其处存放的是地址,int表示从所指地址处开始往后sizeof(int)的区域就是p指示的内存区域。
一直困惑,虽然我知道int的大小,但操作系统如何知道?我知道int32* p是4byte长的区域的起始地址,但操作系统如何知道?p本身并没有携带空间长度信息。
更甚,void*,它如何知道自己这篇区域的长度?
原来。。。是这样:
分配地址,像c++对象模型用来记录UDT信息的结构体一样, 分配出来的区域头部会附着一个结构体用来记录该区域的大小。
参考:http://bbs.bccn.net/thread-81781-1-1.html
用门牌号找到了那栋房子,门口插这一根牌子,上书“占地N坪”。就是这么简单。
也就是说,实际分配的内存总是比申请时的多。
3.
对于没有复杂构造函数的类和结构体,malloc和new效率没有区别。
debug百万个对象有几毫秒差距,release的这个差距几乎木有。
(release的效率大约是debug的一般,大概vs对debug做了啥米链接加速之类的?)
总的来说,木甚区别。如有构造函数的话,当然就要视这片指令的宏伟程度了。
#include<stdio.h>
#include<Windows.h>
structVec3f
{
//Vec3f():x(0.f),y(0.f),z(0.f){;}
floatx;
floaty;
floatz;
};
structVertexBuffer
{
Vec3f point;
Vec3f normal;
floattexCoord[2];
};
intmain()
{
constintnum=1000000;
intbeginTick, endTick;
beginTick=GetTickCount();
printf("new begin: %d\n",beginTick);
for(inti=0;i<num; i++)
{
VertexBuffertmp=newVertexBuffer;
delete tmp;
}
endTick=GetTickCount();
printf("new end: %d, used: %d \n", endTick, endTick-beginTick);
beginTick=GetTickCount();
printf("begin: %d\n",beginTick);
for(inti=0;i<num; i++)
{
VertexBuffertmp=(VertexBuffer) malloc(sizeof(VertexBuffer));
free(tmp);
}
endTick=GetTickCount();
printf("end: %d, used: %d \n", endTick, endTick-beginTick);
system("PAUSE");
return0;
}
原文链接: https://www.cnblogs.com/mumuliang/archive/2011/06/14/2080360.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/27201
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!