初始化结构中的常量数组
initializing an array of constants in a struct
要堆栈溢出成员,我正在编写一个模拟器,它需要多个循环(有时超过1000000),每个循环都涉及大量计算。因此,在一个循环中节省10毫秒可以节省160多分钟的额外计算。所以我正在为我能得到的每一个代码优化而奋斗。以前,我已经将文件中的所有系统参数导入到向量中。过了一会儿,我意识到:
- 正在调用常量int/double/。。。比调用常规的int/double/更快
- 使用数组比使用向量更快
- 我不需要std::string的全部功能,可以制作一个简单的仿制品版本来使用
起初我天真地以为我可以把std::vector<double>
转换成std::vector<const double>
。由于我也一直在尝试用linux制作这种跨平台的编译器,我发现visualstudioexpress编译器忽略了const不能这样声明的事实(而linux只是抛出了大量错误)。
我决定在初始化的结构中使用常量数组;但是,无法弄清楚如何正确初始化它。(我遇到的大多数/所有帮助论坛都说要声明static const int*
并将其初始化为全局,我认为这不适合我的需要)。我最终制定了这个最终解决方案;然而,我相信我犯了一个"禁忌",因为我最终使用了一个指针来声明常量。它编译和运行时没有错误,因此我想知道,使用指针初始化常量数组是错误的吗?如果是这样,你还会怎么做?(我知道用这种方式获取所有数据可能会更慢,但在时间重要的部分,调用应该更快……我认为)
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#if defined(_WIN32) || defined(_WIN64)
#define gsize _msize
#else
#define gsize malloc_usable_size
#endif
struct testy{
const int *i;
const double *d;
testy(){
i=(const int *)malloc(0);
d=(const double *)malloc(0);
}
};
inline const int* getDat(const int* dst, int* src){
dst=(const int*)realloc((void *)dst,gsize((void *)src)); // Allocate enough memory to hold the data
return src;
}
inline const double* getDat(const double* dst, double* src){
dst=(const double*)realloc((void *)dst,gsize((void *)src)); // Allocate enough memory to hold the data
return src;
}
int main(){
testy data;
int *tmp_i = (int *)malloc(0);
double *tmp_d = (double *)malloc(0);
for(int i=0;i<3;i++){ // load empty array with what i want
tmp_i=(int*)realloc((void *)tmp_i,gsize((void *)tmp_i)+1*sizeof(int)); // Increase size by one
tmp_i[i]=i;
}
for(int i=0;i<3;i++){ // load empty array with what i want
tmp_d=(double*)realloc((void *)tmp_d,gsize((void *)tmp_d)+1*sizeof(double)); // Increase size by one
tmp_d[i]=i;
}
data.i=getDat(data.i,tmp_i);
data.d=getDat(data.d,tmp_d);
printf("nIntegersn");
for(int i=0;i<(gsize((void *)data.i)/sizeof(int));i++)
printf("%dt",data.i[i]);
printf("nDoublesn");
for(int i=0;i<(gsize((void *)data.d)/sizeof(double));i++)
printf("%lgt",data.d[i]);
free(tmp_i); free(tmp_d);
_getch();
return 0;
}
我从这段代码中删除了仿冒字符串及其用途,因为在声明它的数组时存在一些问题,我不想在这里问不止一个问题。
- 移除
realloc
。这是昂贵的,也会使内存碎片化 const
不会有任何区别——你必须在一天结束时访问内存,而const
位只是确保你不会改变不应该改变的事情- 如果值是不可变的,则将
(gsize((void *)data.d)/sizeof(double)
之类的东西放在for循环之外。防止每次循环时调用函数 - 使内存缓存工作。即顺序地访问存储器中的内容。从内存传送到处理器的数据可以很容易地预取
- 至于做任何复杂的运算(你没有展示),用一点代数来简化方程。如果可能的话,使用整数,如果可能,这取决于问题空间
相关文章:
- C++常量数组的编译时间较长
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 使用双指针传递 2D 常量数组
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何在可执行文件中存储常量数组?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- LLVM 无法将数组类型强制转换为常量数组
- 如何在C++中的单行中返回常量数组中的值
- C++ 具有常量数组和initializer_list的重载构造函数
- 在可变参数构造函数中初始化常量数组
- 非常量数组
- C/C++ 中的常量数组和静态常量数组有什么区别
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 在常量数组上使用指针遍历
- 具有函数指针常量数组的 C++ 模板化静态类
- 字符常量数组为空,即使已为其赋值 [C++]
- 指向常量数组的指针
- 函数指针的常量数组令人困惑
- 在 c++ 中初始化静态常量数组
- 常量数组类成员初始化