致Stack Overflow会员,
我正在编写一个需要多个循环的模拟器(有时超过100万次),每个循环都涉及到大量计算。因此,循环节省10毫秒可以导致节省超过160分钟的计算时间。因此,我正在努力进行所有可能的代码优化。之前,我将所有系统参数从文件中导入到向量中。后来我意识到:
我决定在初始化的结构体中使用常量数组;但是,我无法找到正确初始化它的方法。(我遇到的大部分/所有帮助论坛都说要声明static const int *并将其作为全局变量进行初始化,但我认为这对我所需的目的无效)。我终于开发出了这个最终解决方案,但我相信我犯了一个“禁忌”,因为我最终使用指针声明常量。它可以编译和运行而没有错误,所以我想知道,使用指针初始化常量数组是否有问题?如果有的话,还有什么其他的方法可以做到这一点吗?(我理解用这种方式获取所有数据可能会更慢,但在时间重要的部分,调用应该更快...我想)
我正在编写一个需要多个循环的模拟器(有时超过100万次),每个循环都涉及到大量计算。因此,循环节省10毫秒可以导致节省超过160分钟的计算时间。因此,我正在努力进行所有可能的代码优化。之前,我将所有系统参数从文件中导入到向量中。后来我意识到:
- 调用常量int / double / ...比调用常规int / double / ...更快
- 使用数组比使用向量更快
- 我不需要std :: string的全部功能,并且可以制作一个简单的仿制版本来使用
我决定在初始化的结构体中使用常量数组;但是,我无法找到正确初始化它的方法。(我遇到的大部分/所有帮助论坛都说要声明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("\nIntegers\n");
for(int i=0;i<(gsize((void *)data.i)/sizeof(int));i++)
printf("%d\t",data.i[i]);
printf("\nDoubles\n");
for(int i=0;i<(gsize((void *)data.d)/sizeof(double));i++)
printf("%lg\t",data.d[i]);
free(tmp_i); free(tmp_d);
_getch();
return 0;
}
我从这段代码中删除了仿冒字符串及其使用,因为声明该数组存在一些问题,而且我不想在这里问更多的问题。