小编sal*_*r p的帖子

boost :: variant和boost :: any如何工作?

如何使用boost库中的变体和任何内部工作?在我正在进行的项目中,我目前使用标记的联合.我想使用其他东西,因为C++中的联合不允许您使用带有构造函数,析构函数或重载赋值运算符的对象.

我查询了任何和变体的大小,并用它们做了一些实验.在我的平台中,variant采用其最长可能类型的大小加上8个字节:我认为我只是8字节的类型信息,其余的是存储值.另一方面,任何只需要8个字节.由于我在64位平台上,我猜任何只是一个指针.

怎么知道它有什么类型?Variant如何通过模板实现它的功能?在使用它们之前,我想更多地了解这些类.

c++ boost-variant boost-any unions

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

如何实现垃圾收集器?

谁能指出我如何实现垃圾收集的良好来源?我正在制作类似lisp的解释语言.它目前使用引用计数,但当然在释放循环依赖对象时失败.

我一直在阅读标记和扫描,三色标记,移动和不移动,增量和停止世界,但是......我不知道什么是最好的方法来保持对象整齐地分成几组同时保持对象内存开销至少,或者如何以递增方式执行操作.

我已经阅读了一些语言,参考计数使用循环参考检测,我可以使用.我知道我可以使用像Boehm这样的免费收藏家,但我想学习如何自己动手.

我会很感激任何在线资料,对于像我这样没有经验的人有某种教程或帮助.

garbage-collection

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

在C中,是数组指针还是用作指针?

我的理解是数组只是指向一系列值的常量指针,当你在C中声明一个数组时,你就是声明一个指针并为它所指向的序列分配空间.

但这让我感到困惑:以下代码:

char y[20];
char *z = y;

printf("y size is %lu\n", sizeof(y));
printf("y is %p\n", y);
printf("z size is %lu\n", sizeof(z));
printf("z is %p\n", z);
Run Code Online (Sandbox Code Playgroud)

使用Apple GCC编译时会得到以下结果:

y size is 20
y is 0x7fff5fbff930
z size is 8
z is 0x7fff5fbff930
Run Code Online (Sandbox Code Playgroud)

(我的机器是64位,指针长8个字节).

如果'y'是常量指针,为什么它的大小为20,就像它指向的值序列一样?变量名'y'是否在编译时被内存地址替换为适当的?那么数组是C中的某种语法糖,它在编译时只是转换为指针的东西吗?

c arrays pointers

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

在C中,在函数中使用静态变量会使它更快吗?

我的功能将被召唤数千次.如果我想让它更快,将局部函数变量更改为静态是否有用?我背后的逻辑是,因为静态变量在函数调用之间是持久的,所以它们仅在第一次分配时,因此,每个后续调用都不会为它们分配内存并且会变得更快,因为内存分配步骤没有完成.

此外,如果上述情况属实,那么使用全局变量而不是参数会更快地在每次调用时将信息传递给函数吗?我认为参数的空间也分配在每个函数调用上,以允许递归(这就是递归占用更多内存的原因),但由于我的函数不是递归的,如果我的推理是正确的,那么理论上取下参数它更快.

我知道我想要做的这些事情是可怕的编程习惯,但请告诉我它是否明智.无论如何我会试一试,但请告诉我你的意见.

c memory-management global-variables local-variables static-variables

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

如何实现"无堆栈"解释语言?

我正在制作自己的类似Lisp的解释语言,我想做尾调优化.我想从C堆栈中释放我的解释器,这样我就可以管理自己从函数到函数的跳转以及我自己的堆栈魔法来实现TCO.(我真的不是指无堆栈本身,只是调用不向C堆栈添加帧的事实.我想使用我自己的堆栈,不会随着尾调用而增长).就像Stackless Python一样,不像Ruby或者......标准Python我猜.

但是,由于我的语言是Lisp派生词,所有对s表达式的评估目前都是以递归方式完成的(因为这是我想到的最明显的方式来做这种非线性,高度分层的过程).我有一个eval函数,每次遇到函数调用时都会调用Lambda :: apply函数.apply函数然后调用eval来执行函数体,依此类推.相互堆栈饥饿的非尾部C递归.我目前使用的唯一迭代部分是评估一系列连续的s表达式.

(defun f (x y)
    (a x y)) ; tail call! goto instead of call. 
             ; (do not grow the stack, keep return addr)

(defun a (x y)
    (+ x y))

; ...

(print (f 1 2)) ; how does the return work here? how does it know it's supposed to
                ; return the value here to be used by print, and how does it know
                ; how to continue execution here??
Run Code Online (Sandbox Code Playgroud)

那么,我如何避免使用C递归?或者我可以使用跳过c函数的某种goto吗?也许是longjmp?我真的不知道.请耐心等待,我主要是自编(Internet)教程.

lisp stack-overflow recursion stack interpreter

16
推荐指数
3
解决办法
2792
查看次数

普通的x86或AMD PC是直接从ROM运行启动/ BIOS代码,还是先将它们复制到RAM?

我知道现代计算机已经修改了哈佛架构.

事实上他们可以从他们保存数据的地方读取指令,这样他们可以直接从ROM芯片中获取指令吗?他们首先将BIOS加载到RAM,还是直接从芯片执行?我没有可以在附近打开的计算机,所以...如果我从内存插槽中删除所有RAM,计算机是否能够启动完整的BIOS,运行POST的东西并告诉我需要RAM?这很有趣我从未尝试过......

编辑:我的意图是要了解商业CPU(或至少是intel cpus)是否可以直接从ROM执行代码.它不是出于实际目的,而是为了增加我对计算机体系结构和内容的理解.删除RAM部分不是我的主要疑问,只是一个例子

cpu boot startup bios

12
推荐指数
1
解决办法
3718
查看次数

我可以在中间而不是结尾使用__VA_ARGS定义可变参数C预处理器宏吗?

如果我这样做,海湾合作委员会会抱怨:

#define M(obj,met, ..., contents) obj##_##met(const void * self, __VA_ARGS__) { \
   contents \
   }
Run Code Online (Sandbox Code Playgroud)

给我这两个理由:

error: missing ')' in macro parameter list
warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro
Run Code Online (Sandbox Code Playgroud)

显然,C99样式的可变参数宏在省略号之后立即期望右括号,有效地要求可变参数列表是宏的最后一个参数.我需要它在中间来产生我在上面的宏中描述的速记符号.GCC是否支持此功能,使用另一种(非C99)可变参数宏样式?我可以模仿它在其他地方做吗?我不希望最后的变量列表,它会让我的符号混乱.我只能使用GCC.

c gcc c99 c-preprocessor variadic-macros

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

lisp函数可以通过引用返回引用或接收参数吗?

我想知道这是如何工作的:

(setf(车x)42)

(car x)是否返回setf的可赋值引用?或者只是宏观魔术?setf或汽车如何工作?

我知道通过引用传递将是函数式编程中的一个可怕的错误,但我想知道上面是如何完成的.

lisp reference

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

在java中,如果只替换最后一个数字项,那么对整数数组进行排序的最佳方法是什么?

这是一个整数数组.它是这样创建的:没有元素重复.每次添加元素时,其编号是下一个可用的整数,从0开始.这样,如果连续添加6个元素,它们将按顺序为0,1,2,3,4,5.如果你删除一个元素,那么数组会缩小,并且两个元素之间留下一个"洞",由于这个间隙,它们不再是连续的:0,1,3,4,5.然后出现了问题:如果你添加一个新元素,它会被添加到最后,但是具有下一个可用的整数.因此,数组现在是0,1,3,4,5,2.它需要进行排序,因此2可以占据1和3之间的位置.最好的方法是什么?我想到了几种方法.该列表几乎是有序的,它具有以下属性:每个元素都等于或大于数组中的索引.我目前正在进行冒泡排序(不要笑),我认为快速排序是矫枉过正,我不想去递归或使用临时数组,我不想更改add-element方法(它添加元素在结束),所以必须在添加元素后立即对其进行排序(因此只有最后一个元素不合适)

java arrays sorting

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

Scheme中的闭包如何工作?

我在Racket/DrScheme中测试了以下代码:

(define (makem)
    (define x 34)
    (list (lambda () (set! x (+ x 1)) x)
          (lambda () (set! x (+ x 1)) x))
)

(define f (car (makem)))
(define f2 (car (cdr (makem))))

> (f)
35
> (f2)
35            ; I thought this would give me 36
> (f)
36
> (f)
37
>
Run Code Online (Sandbox Code Playgroud)

在函数调用中创建的每个lambda都会获取其范围内每个变量的副本吗?它是否像某种隐含的让?我期望lambdas有一些指向它们创建范围的指针,使它们能够访问堆栈变量,但这告诉我,因为f和f2似乎有不同的x副本.究竟发生了什么?

lambda scheme closures scope

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