标签: dynamic-allocation

通过切割一个大的malloc内存来减少malloc调用

首先,我从这里得到了这个想法:

曾经有一个我编写的应用程序使用了大量的内存小块,每个都分配了malloc().它工作正常,但很慢.我用一个替换了对malloc的许多调用,然后在我的应用程序中切掉了那个大块.它要快得多.

我正在分析我的应用程序,当我减少malloc调用的数量时,我得到了意想不到的良好性能提升.不过,我仍在分配相同数量的内存.

所以,我想做这个人做的事情,但我不确定最好的方法是什么.

我的想法:

// static global variables
static void * memoryForStruct1 = malloc(sizeof(Struct1) * 10000);
int struct1Index = 0;
...
// somewhere, I need memory, fast:
Struct1* data = memoryForStruct1[struct1Index++];
...
// done with data:
--struct1Index;
Run Code Online (Sandbox Code Playgroud)

陷阱:

  • 我必须确保我不超过10000
  • 我必须按照我占用的顺序释放内存.(在我的情况下不是主要问题,因为我正在使用递归,但如果可能的话我想避免它).

灵感来自Mihai Maruseac:

首先,我创建一个链表int,基本上告诉我哪些内存索引是免费的.然后我在我的struct中添加了一个属性,int memoryIndex它可以帮助我返回以任何顺序占用的内存.幸运的是,我确信我的内存需求在任何给定时间都不会超过5 MB,所以我可以安全地分配那么多内存.解决了.

c memory malloc dynamic-allocation

4
推荐指数
1
解决办法
926
查看次数

什么是C++中的动态内存分配?

我学习用C动态内存分配++和关键字newnew[]被提及.据说,用户可以在运行时指定内存分配的大小,而不像在源代码中声明一个具有固定大小的变量或数组.

我不明白这个概念.它是如何工作的?我只需要澄清这个想法,一个例子会有所帮助!

c++ malloc memory-management new-operator dynamic-allocation

4
推荐指数
2
解决办法
3788
查看次数

为什么malloc()初始化新分配的内存块的值?

我开始学习C中的动态内存分配,到目前为止,我已经阅读过malloc()函数,并没有初始化新分配的块的值.

这是在较新版本的C中改变了吗?C99和C11?

我正在使用Xcode执行以下操作,所有值都使用0进行初始化.

double *p = (double *) malloc(5 * sizeof(double));

printf("Address of p0 = %p | Valoe of p0 = %f\n", p, *p);
printf("Address of p1 = %p | Valoe of p1 = %f\n", p+1, *(p+1));
printf("Address of p2 = %p | Valoe of p2 = %f\n", p+2, *(p+2));
printf("Address of p3 = %p | Valoe of p3 = %f\n", p+3, *(p+3));
printf("Address of p4 = %p | Valoe of p4 = %f\n", p+4, *(p+4));
Run Code Online (Sandbox Code Playgroud)

我认为这只适用于函数calloc().

c dynamic-allocation

4
推荐指数
1
解决办法
1131
查看次数

如何分配具有连续内存的二维数组?我如何使用它来访问行和列?给我一个例子

我创建了一个二维数组,其内容如下

     int i,j,lx,ly;// lx,ly are the row and column respectively
     double** a;

     a=(double**) malloc((lx+2)*sizeof(double));

     a[0]= (double*) malloc((lx+2)*(ly+2)* sizeof(double));

     assert(a[0]); 

     for(i=1;i<lx+2;i++)
     {
       a[i]=a[i-1]+i*(ly+2);
     }
Run Code Online (Sandbox Code Playgroud)

// 我为这个数组中的所有元素分配了一个值 0,如下所示

    for(i=0;i<(lx+2)*(ly+2);i++)
    {
      a[i]=0;
    } 
Run Code Online (Sandbox Code Playgroud)

// 我打印出下面的所有元素

      for(i=0;i<(lx+2)*(ly+2);i++)
      {
         printf("position %d values %d\n",i,a[i]);
      } 
Run Code Online (Sandbox Code Playgroud)

// 当我看到输出时,它向我显示了一个特定位置 13 处的垃圾值。我无法弄清楚。还请告诉我如何访问行和列,如 Eg 以访问第 7 列第 0 行和第 5 行就 lx 而言,第 6 列列,如我的代码所示

c arrays dynamic-allocation

3
推荐指数
1
解决办法
3008
查看次数

如何在C++中使用new来分配内存?

我有以下静态内存声明:

void* array[5000];
Run Code Online (Sandbox Code Playgroud)

如何operator new在C++中使用相同的内存分配?

c++ new-operator dynamic-allocation

3
推荐指数
1
解决办法
183
查看次数

c ++对象参数:多态,值语义,对象生命周期?

当我从C#转换到C++时,我得到了很多建议,尽可能使用值语义.几乎可以肯定的是,如果我在任何地方发布带有指针的问题,并建议它应该是一个值.我开始看到了光,我在代码中找到了很多地方,我可以用堆栈分配的变量(通常是引用)替换动态分配和指针.所以我认为我掌握了使用堆栈分配的对象,并且当调用者中的对象生命周期比被调用者更长时,将它们作为引用传递给其他函数.

但是,当被调用者获得所有权时,我有一个关于按值传递对象的问题.请看以下示例:

class Zoo
{
  void AddAnimal(Animal animal);
  std::list<Animal> animals_;
}
Run Code Online (Sandbox Code Playgroud)

通常从灵活性和单元测试的角度来看,我希望Animal成为一个接口(C++中的抽象类),这样我就可以轻松地发送任意动物并通过模拟实现来模拟它.

在指针实现中,客户端代码将调用它:

Animal animal = new Lion("Bob");
myZoo.AddAnimal(animal);
Run Code Online (Sandbox Code Playgroud)

这里的客户端代码并不真正需要动物对象.它只是暂时构建它以传递给方法.所以在这种情况下,没有共享语义.所以它似乎是价值语义的一个好例子.但是,我的理解是你不能使用Animal作为值传递的参数,因为它是一个抽象类.

我的大多数不采用原始类型的成员函数都采用抽象类参数.那么处理这个问题的C++方法是什么?(那你是如何使用值语义编写C++接口的呢?)

c++ parameters abstract-class object-lifetime dynamic-allocation

3
推荐指数
1
解决办法
459
查看次数

C中的内存地址

在主函数的最后一行,为什么&word2不同word2?假设正确的标题已到位.谢谢!

int main()
{
    char word1[20];
    char *word2;

    word2 = (char*)malloc(sizeof(char)*20);

    printf("Sizeof word 1: %d\n", sizeof (word1));
    printf("Sizeof word 2: %d\n", sizeof (word2));

    strcpy(word1, "string number 1");
    strcpy(word2, "string number 2");

    printf("%s\n", word1);
    printf("%s\n", word2);
    printf("Address %d, evaluated expression: %d\n", &word1, word1);
    printf("Address %d, evaluated expression: %d\n", &word2, word2); 
    //Why this one differ?
}
Run Code Online (Sandbox Code Playgroud)

c c-strings dynamic-allocation

3
推荐指数
1
解决办法
3160
查看次数

错误:请求成员(也许你打算使用' - >'?)同时使用' - >'

这个错误意味着什么?

错误:请求'*printerInfo'中的成员'Attributes',其指针类型为'PPRINTER_INFO_2 {aka _PRINTER_INFO_2A*}'(也许您打算使用' - >'?)

PPRINTER_INFO_2* printerInfo = NULL;

    void ChangedPrinter()
    {
       ...
       DWORD attributesPrinterInfo;

       printerInfo = (PPRINTER_INFO_2*) malloc(bufferSize);

       attributesPrinterInfo = printerInfo->Attributes; // error

       free(printerInfo);
    }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么???

c++ syntax pointers compiler-errors dynamic-allocation

3
推荐指数
1
解决办法
1万
查看次数

c:动态分配2d char数组时出现问题?

我正在尝试ary[i][j]使用以下代码分配要访问的2D字符数组:

#define stringmaxlen 20

void do_alloc( char ***vals, int valscount ){
    *vals = (char**) calloc( sizeof( char** ), valscount );
    int i = 0;
    for ( ; i<valscount; i++ )
        *vals[i] = (char*) calloc( sizeof( char* ), stringmaxlen );
}

int main( ){
    //......
    char** ary;
    do_alloc( &ary, 10 );
    strcpy( ary[0], "test" );
    //......
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这导致某处出现溢出并且程序执行中存在错误,我从这里获得了一些动态分配的引用:http://staff.science.nus.edu.sg/~phywjs/CZ1102/lecture20/sld014.嗯.

我想知道这里有什么问题以及如何解决这个问题,谢谢.

c arrays dynamic-allocation

3
推荐指数
1
解决办法
93
查看次数

指向结构的C指针数组realloc()错误

我正在尝试制作一个霍夫曼代码来练习C编码,并且我仍然保持同样的错误.

让我解释一下代码.首先,它创建下面的结构:

struct sNo {
    int valor;
    char letra;
    struct sNo *esq;
    struct sNo *dir;
};
typedef struct sNo sNo;
Run Code Online (Sandbox Code Playgroud)

然后它创建一个结构数组('否'):

sNo *No;
No = calloc(qtd_no, sizeof(sNo));
Run Code Online (Sandbox Code Playgroud)

它从键盘中读取一个字符串,在该数组中放置字母和它出现的次数.就像下面的代表'abracadabra'一样:

No:    a/5 b/2 r/2 c/1 d/1  
Run Code Online (Sandbox Code Playgroud)

现在,要创建一个Huffman树,我需要创建另一个数组('pNo'),并指向原始数组:

int qtd_pno = qtd_no;
sNo **pNo;
pNo = calloc(qtd_pno, sizeof(sNo*));
for (i = 0; i < qtd_pno; i++){
    pNo[i] = &No[i];    
}
Run Code Online (Sandbox Code Playgroud)

这两个数组看起来像这样:

No:    a/5 b/2 r/2 c/1 d/1  
pNo:   a/5 b/2 r/2 c/1 d/1  
Run Code Online (Sandbox Code Playgroud)

之后,它可以像下面那样对指针数组进行排序而不更改原始指针:

No:    a/5 b/2 r/2 c/1 d/1  
pNo:   c/1 d/1 …
Run Code Online (Sandbox Code Playgroud)

c arrays struct pointers dynamic-allocation

3
推荐指数
1
解决办法
142
查看次数