小编amj*_*jad的帖子

C中的动态链接库

我对C中的动态链接库有一些疑问。

Q1。 在此处输入图片说明

我的教科书使用图片说明DLL的工作方式,并且似乎复制了libvector.so和的一些重定位和符号表信息libc.so(箭头附在其侧面),但是每当汇编器遇到对最终位置未知的对象的引用时, ,它将生成一个重定位条目,告诉链接器将目标文件合并到可执行文件时如何修改引用。对于libc.so,一切都是已知的(具有所有定义),所以libc.so不应有任何重定位条目,不是吗?

Q2。我的教科书说:

“内存中共享库的.text部分的单个副本可以由不同的运行进程共享”,

假设我有一个使用的程序printf。是.textprintf一个程序结束时,驻留在RAM中的部分是永久保留还是从RAM中退出,而当第二个进程printf再次使用时,它会被加载到RAM中?如果是后者,那么由于我们有多个可以在后台运行的进程,将这.text部分printf移出并载入RAM的效率不是很高吗?

c linker

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

Func委托(C#)中的out参数修饰符

我是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关键字在这里做什么?有什么需要改变的吗?

.net c#

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

为什么浮点数不会溢出到无穷大

假设我们有以下代码:

float f = 999999999999*9999999999999999*999999999999; //a large number to make it overflow
Run Code Online (Sandbox Code Playgroud)

所以根据浮点规则,结果应该是无穷大: 在此处输入图片说明

但是我检查了结果的位表示,它不是无穷大,它是别的,怎么会?

c floating-point

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

在机器代码中区分有符号和无符号

我在看一本教科书,上面写着:

重要的是要注意机器代码如何区分有符号和无符号值。与 C 不同,它不将数据类型与每个程序值相关联。相反,它主要对这两种情况使用相同的(汇编)指令,因为许多算术运算对于无符号和补码算术具有相同的位级行为。

我不明白这是什么意思,谁能给我举个例子?

c assembly unsigned

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

流水线处理器中时钟寄存器的目的是什么

嗨,我正在阅读一本描述 CPU 流水线设计的教科书。我不明白为什么我们仍然需要时钟寄存器?例如,如下图所示:

如果我们能把三个寄存器都去掉,就可以节省60ps,因为我们只需要处理器继续执行指令,所以当一个comb逻辑完成时,也就是下一条指令应该开始执行的时候,为什么我们需要时钟周期来手动控制开始执行指令?

在此处输入图片说明

cpu pipeline cycle cpu-architecture cpu-registers

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

asp.net中的PreLoad和Load事件

我是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)

.net c# asp.net

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

为什么 fork() 将两个进程中的每个页面都标记为只读?

我正在阅读一本教科书,其中讨论了如何fork()使用虚拟内存:

fork当前进程调用该函数时,内核会为新进程创建各种数据结构,并为其分配一个唯一的 PID。为了为新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的精确副本。它将两个进程中的每个页面标记为只读[强调添加],并将两个进程中的每个区域结构标记为私有写时复制。

来源:Computer Systems: A Programmer's Perspective,第 3 章,第 9.8.2 节 -fork重新审视的功能。

我不明白为什么它需要将两个进程中的每个页面都标记为只读。如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量(.bss部分)。那么程序如何工作呢?

c process virtual-memory linux-kernel

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

为什么execve函数映射私有区域?

我正在阅读一本教科书,其中将 eexecve函数描述为:

假设当前进程中运行的程序进行如下调用:

execve("a.out", NULL, NULL);

execve 函数在当前进程中加载​​并运行包含在可执行目标文件 a.out 中的程序,有效地用 a.out 程序替换当前程序。加载和运行a.out需要以下步骤

  1. 删除现有用户区域
  2. 映射私人区域。为新程序的代码、数据、bss 和堆栈区域创建新的区域结构。所有这些新区域都是私有的写时复制

在此处输入图片说明

  1. 映射共享区域
  2. 设置程序计数器

我对第 2 步有点困惑,所以假设fork()分叉一个子进程并让子进程运行execve一个新程序,那么为什么execve将子进程的新区域映射为私有的写时复制?父进程不会与子进程共享内存,因为父子进程映射到不同的对象,为什么子进程害怕其他进程可能会写一些东西来影响它?

c linux virtual-memory

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

函数如何在不使用 malloc 的情况下返回结构?

我是 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_afoo的堆栈,在经过这么foo结束,堆栈将unwinded,其手段foo_a实际上并不存在的main函数的栈指针main_amain持有实际上是一个非法的指针,那么它是怎么样的工作?

c struct allocation return-value

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

为什么 Nullable&lt;T&gt; 不会重载 == 运算符?

Nullable<Int32> x = 5;
Nullable<Int32> y = 10;

if (x == y) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,上面的代码将同时转换xand ytoObject然后 useObjectpublic 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)

那么我们可以保存两个铸件吗?

.net c#

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