相关疑难解决方法(0)

为什么使用alloca()不被视为良好做法?

alloca()在堆栈上而不是在堆上分配内存,如同的情况一样malloc().所以,当我从例程返回时,内存被释放.所以,实际上这解决了我释放动态分配内存的问题.释放分配的内存malloc()是一个令人头痛的问题,如果不知何故错过会导致各种内存问题.

alloca()尽管有上述特征,为什么不鼓励使用?

c malloc stack allocation alloca

381
推荐指数
18
解决办法
12万
查看次数

寻找类似C++ STL的矢量类,但使用堆栈存储

在我写自己之前,我会问你们所有人.

我正在寻找一个几乎完全像STL向量的C++类,但是将数据存储到堆栈中的数组中.某种类型的STL分配器类也可以工作,但我试图避免任何类型的堆,甚至是静态分配的每线程堆(尽管其中一个是我的第二选择).堆栈效率更高.

它需要几乎替代使用向量的当前代码.

对于我自己要写的东西,我在考虑这样的事情:

char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)

或者类可以在内部分配缓冲区空间.然后它看起来像:

stack_vector<match_item, 256> matches;
Run Code Online (Sandbox Code Playgroud)

我认为如果空间不足,它会抛出std :: bad_alloc,尽管这不应该发生.

更新

使用Chromium的stack_container.h效果很好!

我之所以没想过这样做的原因是我总是忽略了STL集合构造函数的allocator对象参数.我已经使用了几次模板参数来做静态池,但是我从未见过代码或编写任何实际使用过对象参数的代码.我学到了新东西.很酷!

代码有点乱,由于某种原因,GCC强迫我将分配器声明为实际项而不是将其构造为vector的allocator参数.它来自这样的事情:

typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector< comp_list_item > comp_list_type;

comp_list_type match_list;
match_list.reserve(32);
Run Code Online (Sandbox Code Playgroud)

对此:

static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;

comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc( &match_list_buffer );
comp_list_type match_list( match_list_alloc );
match_list.reserve( comp_list_alloc_size ); …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector data-structures

53
推荐指数
5
解决办法
2万
查看次数

使用指针的数组内存地址分配声明的相同优先级

我已经研究过并且我清楚地知道数组不是指针
但是我已经学到了一些我认为可能使用指针声明声明类似数组的变量的东西.我知道的事情:

  • 声明指针使用解除引用运算符:int *x;
  • 在声明指针时,我知道它只保存内存地址......
  • 使用指针回显数组中的值将是:
  • 声明时a[3],它在堆栈上分配3个空的内存地址.
    因此,它是好像是说*(a+0),*(a+1),*(a+3)是在堆栈的使用分配. 数组<code>a</code>3的范围</noimg></li>
</ul>

<p><strong>我想使用指针执行相同的内存地址分配声明优先级</strong></p>

<p>我可以使用指针做那样的事吗?<br>将指针声明指向指向获取不同地址的指针很容易<code>**p</code><br></p>

<p>我期待有可能创建一个指针声明,从当前地址和它遵循的地址分配内存,所以它将是类似数组的结构</p>

<p>示例:我知道<code>int a[3];</code>使用指针声明不会只是<code>int *(a+3)</code>
<br><em>如果我问的是不可能请回答原因.</em></p>

<hr>

<p>这是普通数组声明和调用的简单代码:<a rel=Ideone Code

    #include <stdio.h>
    char block[3]={1,2,3};// This line will be removed
    //And would create a pointer declaration of that having array-like structure
    
    int main() {
        while(i < sizeof(block))
        printf("%d", block[i++]);
        //And that I still …
    Run Code Online (Sandbox Code Playgroud)

c arrays pointers memory-management

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