我正在尝试在C中实现一个简单的标记和清除垃圾收集器.算法的第一步是找到根.所以我的问题是如何在C程序中找到根源?
在使用malloc的程序中,我将使用自定义分配器.这个自定义分配器是从C程序调用的所有东西,也可以是自定义的init().
垃圾收集器如何知道程序中的所有指针(根)?另外,给定一个自定义类型的指针,它如何得到所有指针?
例如,如果有一个指向类列表的指针p,其中有另一个指针...说q.垃圾收集器如何知道它,以便它可以标记它?
更新:如果我在启动它时将所有指针名称和类型发送到GC怎么样?类似地,也可以发送不同类型的结构,以便GC可以遍历树.这甚至是一个理智的想法还是我只是疯了?
我有一个DLL,它导出一个函数...
extern "C"
int __stdcall
MP_GetFactory( gmpi::IMpUnknown** returnInterface )
{
}
Run Code Online (Sandbox Code Playgroud)
我用Code :: Blocks GCC编译器(V3.4.5)编译它.问题:导致dll导出装饰函数名称...
MP_GetFactory@4
Run Code Online (Sandbox Code Playgroud)
这无法加载,应该是老了......
MP_GetFactory
Run Code Online (Sandbox Code Playgroud)
我研究了大约4个小时.我认为--add-stdcall-alias是修复此问题的选项.我的代码::块日志显示...
mingw32-g ++.exe -shared -Wl, - out-implib = bin\Debug\libGainGCC.a -Wl, - dll obj\Debug\se_sdk3\mp_sdk_audio.o obj\Debug\se_sdk3\mp_sdk_common.o obj\Debug\Gain\Gain.o obj\Debug\Gain\gain.res -o bin\Debug\GainGCC.sem --add -stdcall-alias -luser32
..所以我认为这是正确的选择吗?但没有运气.Dependancy Walker仅显示正在导出的装饰名称.我通过使用__cdecl而不是__stdcall得到了它的工作,然后将该名称导出为ok,但该函数在被调用时会破坏堆栈(因为调用者期望其他调用约定).
基本上,我正试图以我想要的方式突出显示下面的coffeescript代码.可以在此处找到coffeescript函数语法的说明.
nameHere = (tstamp, moo, boo) ->
...
Run Code Online (Sandbox Code Playgroud)
名称tstamp,moo和boo应该是粉红色的(没有别的,不是逗号而不是括号),因为它们是lambda函数的参数.
highOrderFun ((x) -> x * x) someList
Run Code Online (Sandbox Code Playgroud)
这是第一个x是参数.参数可以有默认参数:
class Foo
meth: (msg = "Hello", bar = "foo") ->
....
Run Code Online (Sandbox Code Playgroud)
默认参数可以是变量本身:
defColor = "red"
print = (msg, color = defColor) ->
...
Run Code Online (Sandbox Code Playgroud)
因此,msg与color上述应当强调,但不是defColor.更棘手的情况是具有默认参数的函数本身就是函数.我认为emacs的font-lock很难正确突出显示,但我仍然包括它:
funTakingFuns = (f1 = ((a, b) -> a*b), f2 = ((c, d) -> c/d)) ->
...
Run Code Online (Sandbox Code Playgroud)
这在emacs中实现起来相当复杂,因为您希望突出显示对上下文敏感.我已经阅读了有关font-lock的文档,但一直未能弄清楚.
如果有人能告诉我要设置什么font-lock-defaults来使语法突出显示我想要的方式,我将不胜感激.
更新显示更多coffeescript语法示例.
emacs elisp syntax-highlighting font-lock context-free-grammar
这是场景:有人有一个我已经分叉的 git 存储库(如果重要的话,在 github 上)。在我的分支中,我创建了许多分支,其中包含上游已拉取的更改。或者在某些情况下应用我的分支的差异而不是正确拉动分支。
我想要找到的是我所有分支的列表,这些分支已经完全合并到上游主分支中。这样我就可以安全地删除这些分支,因为git branch其他工具列出了 30 多个分支,而且看起来很杂乱。
我想我正确地解释了为什么这个问题与链接的问题不同:或者在某些情况下应用了我的分支的差异而不是正确地拉动分支例如git branch --merged不是一个完整的答案,但是哦......
我正在实施Karger的算法.据我所知,最后两个节点之间的边数并不总是Min Cut.我无法理解的是如何实际获得此算法的最小切割.我一直在寻找很多关于概率的东西,但这一切对我来说都是胡言乱语......
根据我的阅读,我认为我需要在图表上多次运行Karger算法.这将使我很有可能成功击中最低限度.我认为?...
有人可以用更简单的方式解释一下吗?如何查找运行此算法的次数?我上面说的甚至是正确的吗?
如何自由计算已用内存,为什么它与/ proc报告有什么不同?
# cat /proc/*/status | grep VmSize | awk '{sum += $2} END {print sum}'
281260
Run Code Online (Sandbox Code Playgroud)
但免费说:
# free
total used free shared buffers cached
Mem: 524288 326488 197800 0 0 0
Run Code Online (Sandbox Code Playgroud)
谁是对的?是使用281260kb内存还是326488kb?
我想知道是否存在热点JVM或任何其他JVM可以确定性地进行垃圾收集的任何实例.我知道转义分析,但想知道它是否也适用于堆分配的对象.我的意思是在C++代码中,这样可以在堆中提供确定性的垃圾收集
#include <vector>
int main(int argc, char*argv[]){
std::vector<double> v_somevector;
} // std::vector::~vector() is called determinitically
Run Code Online (Sandbox Code Playgroud)
当然在Java中就像
.
.
.
private double ma() throws Exception{
double result = 0.0;
final double[] closes = new double[100000];
//perform some calculation using the closes array above
return result;
} // At this point why shouldn't closes be deterministically garbage collected (as in immediately)?
Run Code Online (Sandbox Code Playgroud)
在收集关闭数组的垃圾中应该是确定性的.对于看起来似乎,转义分析似乎关注在堆栈上分配关闭数组的可能性,但即使在堆上分配,在这种情况下,我不明白为什么它离开ma()时无法收集范围
任何人都可以解释卡表的概念和.Net 中垃圾收集过程中的写入障碍吗?我真的无法理解这些术语的解释,即它们是什么,它们有什么用以及它们如何参与GC。任何帮助将非常感激。
我在 OpenCL 1.2 中遇到问题。__global看,我有一个内核中的数组,组大小为 1000。问题是该atomic_add()函数无法正常工作。
我的内核代码是:
__kernel void kernelfunction(__global uint32_t* buffer){
buffer[3] = 100;
atomic_add(&buffer[3], 1);
...
}
Run Code Online (Sandbox Code Playgroud)
如果我创建 1000 个线程,我预计 的值buffer[3]将是 1100,对吗?但程序的行为是未定义的。有时会是 1100,有时是 1064,有时是 1093,...
我尝试过的:
我还启用了 opencl 扩展,如下所示:
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
但问题依然存在。在另一个项目中,我创建了一个简单的 opencl 项目并且工作atomic_add正常,并且我检查了几乎整个项目配置,但我不知道问题出在哪里。
你能帮助我吗?谢谢
我注意到 OpenCL 有一个select()函数/内置/运算符,它似乎类似于 C 和 C++ 中的三元运算符,但又不完全一样。select()和之间有什么区别?:,如果我们有后者,为什么还需要前者?