我知道如何使用malloc在堆上创build一个struct 。 正在寻找一些有关在堆栈中创build一个struct文档,但所有的文档。 似乎只谈堆上的结构创build。
我是Go的新手,我正在体验C风格的基于堆栈的编程,即自动variables存在于堆栈中,分配的内存驻留在堆栈上,以及Python风格的基于堆栈的编程只有堆栈上的东西是引用/指向堆上的对象的指针。 据我所知,以下两个函数给出了相同的输出: func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) … return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType … return &chunk, nil } 即分配一个新的结构并返回它。 如果我用C编写的话,第一个会把一个对象放在堆上,第二个放在堆栈上。 第一个会返回一个指向堆的指针,第二个会返回一个指向堆栈的指针,这个指针在函数返回的时候会蒸发掉,这将是一件坏事。 如果我用Python(或除C#之外的其他许多现代语言)编写它,则示例2将不可能。 我得到的垃圾收集这两个值,所以上述两种forms都很好。 去引用: 请注意,与C不同的是,返回局部variables的地址是完全正确的。 与该variables相关的存储在函数返回后仍然存在。 实际上,每一次复合文本的地址分配一个新的实例,所以我们可以结合这两行。 http://golang.org/doc/effective_go.html#functions 但是它提出了一些问题。 1 – 在示例1中,结构在堆中声明。 例2呢? 这是在堆栈中以同样的方式在C中声明,还是在堆上呢? 2 – 如果在堆栈中声明了示例2,函数返回后如何保持可用状态? 3 – 如果实例2实际上是在堆中声明的,它是如何通过值而不是通过引用传递的? 这种情况下的指针是什么?
我目前正在研究一个性能非常关键的程序,我决定探索一条可能有助于减less资源消耗的path,从而增加我的工作线程的堆栈大小,这样我就可以移动大部分数据( float[] )访问堆栈(使用stackalloc )。 我读过一个线程的默认堆栈大小为1 MB,所以为了移动我所有的float[]我必须将堆栈扩展大约50倍(到50 MB〜)。 我知道这通常被认为是“不安全的”,不build议使用,但是通过对这个方法进行基准testing,发现处理速度提高了530% ! 所以我不能不经过进一步的调查就通过这个选项,这就引出我的疑问。 将堆栈增加到如此之大(可能出错的地方)有哪些危险?我应该采取哪些预防措施来尽量减less这种危险? 我的testing代码, public static unsafe void TestMethod1() { float* samples = stackalloc float[12500000]; for (var ii = 0; ii < 12500000; ii++) { samples[ii] = 32768; } } public static void TestMethod2() { var samples = new float[12500000]; for (var i = 0; i < […]
在C中,我知道我可以使用下面的代码在堆上动态分配一个二维数组: int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } 显然,这实际上创建了一个指向一堆单独的一维整数数组的指针的一维数组,“系统”可以找出我的意思,当我要求: someNumbers[4][2]; 但是当我静态声明一个二维数组,如下面的行…: int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; …是否在堆栈上创建了类似的结构,还是完全是另一种形式? (也就是说,它是一个指针的一维数组吗?如果不是,它是什么,以及如何得到它的引用?) 另外,当我说“系统”时,究竟是什么负责确定呢? 内核? 或者C编译器在编译时将其整理出来?