#include <iostream>
using namespace std;
void main()
{
//用new创建一个二维数组,有两种方法,是等价的
//一:
int (*p)[10] = new int[5][10];
//二:
int **p = new int* [5];
for(int i=0;i <5;i++)
p[i] = new int[10];
}
以上是一般的程序,需要注意的是,内存空间的划分是5行10列,但是p的维度是按照列,而不是按照行声明的。
在自己编写benchmark,运行在cpu上时,预期是声明16*128的数组,这样每行是128*4 (因为int 4byte)= 512 byte。通过每次间隔128byte读取,唤醒prefetch机制。
但是一开始错误的声明为了new int [128][16],这样第一次读取[32][0],第二次读取[64][0],并不是间隔32*4byte,而是间隔32*4*16=2K的空间。
一维数组
- 静态 int array[100]; 定义了数组array,并未对数组进行初始化
- 静态 int array[100] = {1,2}; 定义并初始化了数组array
- 动态 int* array = new int[100]; delete []array; 分配了长度为100的数组array
- 动态 int* array = new int[100]{1,2}; delete []array; 为长度为100的数组array初始化前两个元素
二维数组
- 静态 int array[10][10]; 定义了数组,并未初始化
- 静态 int array[10][10] = { {1,1} , {2,2} }; 数组初始化了array[0][0,1]及array[1][0,1]
- 动态 int (*array)[n] = new int[m][n]; delete []array; // in c++11: auto array = new int[m][n]
- 动态 int** array = new int*[m]; for(i) array[i] = new int[n]; for(i) delete []array[i]; delete []array; 多次析构
- 动态 int* array = new int[m*n]; delete []array; 数组按行存储
- 注意这种方式不可用: int **array = new int[m][n];