我对C中的动态链接库有一些疑问。
我的教科书使用图片说明DLL的工作方式,并且似乎复制了libvector.so和的一些重定位和符号表信息libc.so(箭头附在其侧面),但是每当汇编器遇到对最终位置未知的对象的引用时, ,它将生成一个重定位条目,告诉链接器将目标文件合并到可执行文件时如何修改引用。对于libc.so,一切都是已知的(具有所有定义),所以libc.so不应有任何重定位条目,不是吗?
Q2。我的教科书说:
“内存中共享库的.text部分的单个副本可以由不同的运行进程共享”,
假设我有一个使用的程序printf。是.text第printf一个程序结束时,驻留在RAM中的部分是永久保留还是从RAM中退出,而当第二个进程printf再次使用时,它会被加载到RAM中?如果是后者,那么由于我们有多个可以在后台运行的进程,将这.text部分printf移出并载入RAM的效率不是很高吗?
我是C#的初学者,只是有关Func委托的一个问题:
public delegate TResult Func<in T,out TResult>(T arg);
Run Code Online (Sandbox Code Playgroud)
我可以理解需要in在T之前放置关键字,因为我们不想修改源输入,但是out在TResult之前呢?那不是意味着我们需要修改输出,但是为什么呢?有时候我们不是即时生成返回对象,而是说我们有一个委托:
Func<string, bool> nameFilter = str => str[0] == 'S';
Run Code Online (Sandbox Code Playgroud)
因此它检查字符串以查看其第一个字符是否为'S',然后返回true或false,因此我们动态返回此布尔值,out关键字在这里做什么?有什么需要改变的吗?
假设我们有以下代码:
float f = 999999999999*9999999999999999*999999999999; //a large number to make it overflow
Run Code Online (Sandbox Code Playgroud)
但是我检查了结果的位表示,它不是无穷大,它是别的,怎么会?
我在看一本教科书,上面写着:
重要的是要注意机器代码如何区分有符号和无符号值。与 C 不同,它不将数据类型与每个程序值相关联。相反,它主要对这两种情况使用相同的(汇编)指令,因为许多算术运算对于无符号和补码算术具有相同的位级行为。
我不明白这是什么意思,谁能给我举个例子?
嗨,我正在阅读一本描述 CPU 流水线设计的教科书。我不明白为什么我们仍然需要时钟寄存器?例如,如下图所示:
如果我们能把三个寄存器都去掉,就可以节省60ps,因为我们只需要处理器继续执行指令,所以当一个comb逻辑完成时,也就是下一条指令应该开始执行的时候,为什么我们需要时钟周期来手动控制开始执行指令?
我是ASP.NET的初学者,只是关于页面生命周期的问题:
MSDN文档说:"在页面为自身和所有控件加载视图状态后,在它处理Request实例包含的回发数据之后引发",这意味着,我也可以将编程逻辑放在这里
protected void Page_PreLoad(object sender, EventArgs e)
{
Label1.Text = "Hello World; the time is now " + DateTime.Now.ToString();
}
Run Code Online (Sandbox Code Playgroud)
那么为什么我们总是喜欢
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = "Hello World; the time is now " + DateTime.Now.ToString();
}
Run Code Online (Sandbox Code Playgroud)
?
我正在阅读一本教科书,其中讨论了如何fork()使用虚拟内存:
当
fork当前进程调用该函数时,内核会为新进程创建各种数据结构,并为其分配一个唯一的 PID。为了为新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的精确副本。它将两个进程中的每个页面标记为只读[强调添加],并将两个进程中的每个区域结构标记为私有写时复制。
来源:Computer Systems: A Programmer's Perspective,第 3 章,第 9.8.2 节 -fork重新审视的功能。
我不明白为什么它需要将两个进程中的每个页面都标记为只读。如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量(.bss部分)。那么程序如何工作呢?
我正在阅读一本教科书,其中将 eexecve函数描述为:
假设当前进程中运行的程序进行如下调用:
execve("a.out", NULL, NULL);
execve 函数在当前进程中加载并运行包含在可执行目标文件 a.out 中的程序,有效地用 a.out 程序替换当前程序。加载和运行a.out需要以下步骤
我对第 2 步有点困惑,所以假设fork()分叉一个子进程并让子进程运行execve一个新程序,那么为什么execve将子进程的新区域映射为私有的写时复制?父进程不会与子进程共享内存,因为父子进程映射到不同的对象,为什么子进程害怕其他进程可能会写一些东西来影响它?
我是 C 新手,只是一个关于返回结构的问题。我听到有人说可以返回一个结构体。例如:
struct MyObj{
int x,y,z;
};
struct MyObj foo(){
struct MyObj foo_a;
foo_a.x = 10;
foo_a.y = 10;
foo_a.z = 10;
return foo_a;
}
int main () {
struct MyObj main_a = foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
foo_a是foo的堆栈,在经过这么foo结束,堆栈将unwinded,其手段foo_a实际上并不存在的main函数的栈指针main_a是main持有实际上是一个非法的指针,那么它是怎么样的工作?
Nullable<Int32> x = 5;
Nullable<Int32> y = 10;
if (x == y) {
...
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,上面的代码将同时转换xand ytoObject然后 useObject的public static bool Equals(Object objA, Object objB)方法
如果我的理解是正确的,那么为什么不重载 == 和 != 运算符为Nullable<T>:
public struct Nullable<T> where T : struct {
...
public static bool operator == (Nullable<T> a, Nullable<T> b) {
...// do some nesseary null check
return value.Equals(other);
}
}
Run Code Online (Sandbox Code Playgroud)
那么我们可以保存两个铸件吗?