据我所知,类的每个实例在内存中都有自己的成员变量,因此它可以为不同的对象存储不同的值.但是,成员函数不一样.成员函数在类的对象之间重用,因此它只有一个地址和一个内存块,以便在所有对象需要时引用.
静态函数用于访问静态成员.但是,静态函数在其应用程序的生命周期中也只存在一个.除了作为静态访问器之外,在低级别它与普通的类功能没有区别,不是吗?或许我错了,每个班级都有自己的功能?
可以使用反斜杠字符\来区分特殊字符.但是,我想将完整句点视为正常字符来操作隐藏文件夹.例如:
ls -lh .
它将列出当前目录.但是,我想列出所有隐藏文件夹.我希望它可用du -h
,所以我知道隐藏文件夹消耗的磁盘空间.
据我所知,Lisp语法代表AST,但是在高级格式中允许人们轻松读取和修改,同时也使机器也可以轻松处理源代码.
出于这个原因,在Lisp中,据说代码是数据,数据是代码,因为代码(s-epxression)本质上只是AST.我们可以将更多的AST(这是我们的数据,只是lisp代码)插入其他AST(lisp代码)或独立地扩展其功能并动态操作它(运行时),而无需重新编译整个操作系统以集成新的在其他语言中,我们必须重新编译,以便在将人类语言源代码编译成代码之前将其转换为有效的AST.
这是Lisp语法设计的原因(首先代表一个AST但是人类可读,以满足人类和机器)吗?为了实现更强(在运行中 - 运行时)以及人机之间更简单(无重新编译,更快)的通信?
我听说Lisp机器只有一个地址空间来保存所有数据.在像Linux这样的操作系统中,程序员只有虚拟地址空间,并假装它是真正的物理地址空间,可以随心所欲.Linux中的数据和代码是分离的区域,因为有效地,数据是数据,数据是代码.在用C(或类似C语言)编写的普通操作系统中,如果我们只为整个系统操作一个地址空间并且将数据与代码混合会非常混乱,那将会非常混乱.
在Lisp Machine中,由于代码是数据而数据是代码,这是否只有一个地址空间(没有虚拟层)的原因?既然我们有GC而没有指针,那么在没有破坏它的情况下操作物理内存是否安全(因为只有1个单独的空间要复杂得多)?
编辑:我问这个是因为据说Lisp的一个优点是单地址空间:
安全的语言意味着可靠的环境,而无需将任务分离到各自独立的存储空间中.
Unix处理的"明显分离的过程"模型在处理可能不安全的软件时具有强大的优点,就像使用C或C++编写的代码一样,无效的指针访问可以"取消系统." 在这个意义上,MS-DOS及其继承人是非常不可靠的,几乎任何程序错误都可能导致整个系统崩溃; "蓝屏死神"等喜欢.
如果整个系统是用Lisp构造和编码的,那么系统就像Lisp环境一样可靠.通常这是非常安全的,因为一旦你进入符合标准的层,它们就非常可靠,并且不提供允许系统自毁的直接指针访问.
易失性存储设备(即RAM)应专门用作非易失性存储设备的读/写高速缓存.从除操作系统之外的所有软件的角度来看,机器必须提供单个地址空间,这可以被认为是非易失性的.没有任何计算机系统遵守这项法律,从电源中断中完全恢复其状态所需的时间要长于电灯.
如上所述,单个地址空间将所有正在运行的进程保存在同一个内存空间中.我很好奇为什么人们坚持认为单个地址空间更好.我把它与Lisp的AST语法联系起来,试图解释它如何适合单个空间模型.
使用 0 作为主设备号是什么意思?我试过0;该设备未出现在 中/dev
,但已在 中列出/proc/devices
。
我创建了一个字符设备register_chrdev
:
register_chrdev(0, DEVICE_NAME, &char_fops);
我试过这个设置:
(setq gnus-select-method '(nnml "comp.lang.lisp"))
Run Code Online (Sandbox Code Playgroud)
但是当我激活Gnus时,没有显示任何组织.如何添加组comp.lang.*
?
编辑:我尝试使用nntp:
(setq gnus-select-method '(nntp "comp.lang.lisp"))
但它不起作用:
Warning: Opening nntp server on comp.lang.lisp...failed: ; Server nntp+comp.lang.lisp previously determined to be down; not retrying
在WINUSER.H中,它定义了WS_OVERLAPPEDWINDOW,如下所示:
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \
WS_CAPTION | \
WS_SYSMENU | \
WS_THICKFRAME | \
WS_MINIMIZEBOX | \
WS_MAXIMIZEBOX)
Run Code Online (Sandbox Code Playgroud)
我不明白的是,不是operator |
,是什么| \
呢?
我从http://www.sgi.com/tech/stl/download.html下载了STL源代码,但它只有函数声明的.h.我在哪里可以下载.cpp文件来阅读实际的实现?
例如,在stl_multimap.h或stl_map.h中,它具有:
template <class _Key, class _Tp, class _Compare, class _Alloc>
inline void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x,
multimap<_Key,_Tp,_Compare,_Alloc>& __y) {
__x.swap(__y);
}
Run Code Online (Sandbox Code Playgroud)
我想知道交换的实际实现
__x.swap(__y);
Run Code Online (Sandbox Code Playgroud)
我没有看到swap的实际代码在哪里.在这里,它只是自称.
所以,通常我们将typedef设置为另一个类型或函数指针,但是对于指针来说typedef类型对我来说很奇怪.例如,在winnt.h中我们得到:
typedef void *HANDLE;
typedef PVOID HANDLE;
Run Code Online (Sandbox Code Playgroud)
和PVOID是:
typedef void *PVOID,*LPVOID;
Run Code Online (Sandbox Code Playgroud)
据认为,在第一条语句必须是*处理,因为它是作废的指针,而PVOID是已经作废的指针,因此需要不被声明为一个指针.
但是,对指针类型的typedef有什么好处?这不是更令人困惑吗?
例如:
<0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
<c> DW_AT_producer : (indirect string, offset: 0xe): GNU C1
1 5.4.0 20160609 -masm=intel -m32 -mtune=generic -march=i686 -g -fst
ack-protector-strong
<10> DW_AT_language : 12 (ANSI C99)
<11> DW_AT_name : (indirect string, offset: 0xbe): hell
o.c
<15> DW_AT_comp_dir : (indirect string, offset: 0x97): /tmp
<19> DW_AT_low_pc : 0x804840b
<1d> DW_AT_high_pc : 0x2e
<21> DW_AT_stmt_list : 0x0
<1><25>: Abbrev Number: 2 (DW_TAG_base_type)
<26> DW_AT_byte_size : 4
<27> DW_AT_encoding : 7 (unsigned)
<28> DW_AT_name : (indirect string, offset: …
Run Code Online (Sandbox Code Playgroud)