register变量,又,指针,再,malloc/new

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++)

{

VertexBuffer
tmp=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++)

{

VertexBuffer
tmp=(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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午4:46
下一篇 2023年2月8日 上午4:47

相关推荐