1,C99标准是指1999年诞生的C语言标准;C11标准是指2011年诞生的C语言标准。
2,常见的标准类型有:
int8_t int16_t int32_t int64_t
uint8_t uint16_t uint32_t uint64_t
float double
Visual C++ 没有严格支持C99,它不支持上面的整型类型,它支持的对应的整型类型是 __int8 __int16 __int32 __int64 。
3,尽量不要使用int。虽然大部分情况下int等同于int32_t,但万一遇到一个奇葩的环境使得int等同于int16_t呢。。。
4,有时候需要把一个指针转换成整型数字,可以用uintptr_t来存储这个指针地址。在32位平台上,uintptr_t等同于uint32_t;在64位平台上,uintptr_t等同于uint64_t。
它的有符号的形式是intptr_t。
5,size_t在编程中非常基础,它是“能够容纳最大的数组索引的整数”。最常见的情况,它是运算符sizeof的返回类型。在32位平台上,size_t等同于uint32_t;在64位平台上,size_t等同于uint64_t。
6,C99允许在for循环中声明内联计数器,所以,不要这样写:
int i;
for (i=0; i<99; ++i)
应该这样写:
for (int i=0; i<99; ++i)
8,C语言允许对自动分配的数组进行静态初始化。所以,不要这样写:
int32_t kkk[32];
memset(kkk, 0, sizeof(kkk));
应该写成:
int32_t kkk[32] = {0};
struct myStruct
{
int64_t num1;
int32_t num2;
};
myStruct kkk;
memset(&kkk, 0, sizeof(kkk));
应该这样写:
struct myStruct
{
int64_t num1;
int32_t num2;
};
myStruct kkk = {0};
重要提示:{0}方法不会将“由于内存自动对齐而额外增加的那部分内存”清零。对于 myStruct kkk ,{0}方法只能把前12个字节清零。
10,下面的写法是正确的:
struct myStruct
{
int64_t num1;
int32_t num2;
};
myStruct kkk = {0};
myStruct mmm = {num2 = 22};
mmm = kkk;
myStruct nnn = struct myStruct{0}; //编译器自动创建匿名结构体,并将其值填充到目标中
11,C99添加可变长数组(C11可选)。下面的写法是正确的:
uint32_t Num = 60*60;
int32_t Array[Num]; //Num是一个变量,但是语法是正确的,效果与 int32_t Array[3600] 完全一样
我们应该禁止这种写法,因为它是占用栈上的内存,一旦申请过多的内存就会导致程序崩溃。如果你能够保证Num这个变量的取值在可控范围内,不会申请太多的内存,那么可以谨慎的使用这种写法。
12,永远不使用malloc,而应该用calloc,当得到为0的内存时将不会有性能损失。如果你不喜欢函数原型calloc(object count, size per object),可以用#define mycalloc(N) calloc(1, N) 将其封装起来。
//<<<<<<<<<<<<<<<<<<<<<<<<<
以上内容是在【http://geek.csdn.net/news/detail/63135】这篇文章上,总结出来的。
//>>>>>>>>>>>>>>>>>>>>>>>>>
13,int32_t,size_t,等等类型名中都有 "_t" ,它貌似就是一种标注,意思是typedef的缩写。也即,int32_t,size_t都是通过typedef定义出来的。
14,std::string和std::vector对象如何释放内存呢?执行clear()函数,size()会变成0,但是capacity()不会变成0。
正确的方法是:要释放对象A的全部内存,先构造一个临时对象,再执行 "临时对象.swap(对象A)" ,完毕。
vector<int>().swap(myVector);