初始化结构中的常量数组

时间:2013-07-24 01:52:27

标签: c++ c pointers const

要堆叠溢出成员,     我正在编写一个需要多个循环(有时超过1,000,000)的模拟器,每个循环都涉及繁重的计算。因此,在循环上节省10毫秒可以节省超过160分钟的计算时间。所以我正在争取我能得到的每一个代码优化。以前我将所有系统参数从文件导入到矢量中。过了一会儿,我意识到:

  1. 调用常量int / double / ...比调用常规int / double /...
  2. 更快
  3. 使用数组比使用向量更快
  4. 我不需要std :: string的全部功能,可以使用它的简单版本
  5. 最初我天真以为我可以将std::vector<double>转换为std::vector<const double>。由于我也试图用linux创建这个跨平台,我发现visual studio express编译器忽略了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("\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;
    }
    

    我从此代码中删除了仿冒字符串及其用法,因为在声明其数组时存在一些问题,我不想在这里提出多个问题。

1 个答案:

答案 0 :(得分:3)

  1. 删除realloc。这是昂贵的,也是碎片记忆
  2. const不会有任何区别 - 你必须在一天结束时访问内存而const位只是确保你不会改变你不应该改变的东西
  3. 如果值是不可变的,则将(gsize((void *)data.d)/sizeof(double)之类的内容放在for循环之外。每次绕循环阻止函数调用
  4. 使内存缓存有效。即顺序访问存储器中的内容。从内存发送到处理器的数据可以轻松预取。
  5. 对于任何复杂的操作(你没有展示过),使用一点代数来简化方程式。如果可能的话,尽可能使用整数而不是双精度,这取决于问题空间。