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>
struct Vec3f
{
//Vec3f():x(0.f),y(0.f),z(0.f){;}
float x;
float y;
float z;
};
struct VertexBuffer
{
Vec3f point;
Vec3f normal;
float texCoord[2];
};
int main()
{
const int num = 1000000;
int beginTick, endTick;
beginTick = GetTickCount();
printf("new begin: %d\n",beginTick);
for (int i=0 ;i<num; i++)
{
VertexBuffer* tmp = new VertexBuffer;
delete tmp;
}
endTick = GetTickCount();
printf("new end: %d, used: %d \n", endTick, endTick - beginTick);
beginTick = GetTickCount();
printf("begin: %d\n",beginTick);
for (int i=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");
return 0;
#include <Windows.h>
struct Vec3f
{
//Vec3f():x(0.f),y(0.f),z(0.f){;}
float x;
float y;
float z;
};
struct VertexBuffer
{
Vec3f point;
Vec3f normal;
float texCoord[2];
};
int main()
{
const int num = 1000000;
int beginTick, endTick;
beginTick = GetTickCount();
printf("new begin: %d\n",beginTick);
for (int i=0 ;i<num; i++)
{
VertexBuffer* tmp = new VertexBuffer;
delete tmp;
}
endTick = GetTickCount();
printf("new end: %d, used: %d \n", endTick, endTick - beginTick);
beginTick = GetTickCount();
printf("begin: %d\n",beginTick);
for (int i=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");
return 0;
}