根据这个,函数依次继承Function和Function从Function.prototype:
但是,全局
Function对象没有自己的方法或属性,因为它本身就是一个函数,它通过原型链继承了一些方法和属性Function.prototype.
那么重点是Function.prototype什么?为什么不动它的属性Function,让Function.prototype有undefined?函数将来自Function.
同样适用于Object等
我有一个非常奇怪的不一致.
我准备读取Arduino上的二进制文件(对于midi播放器,如果你感兴趣的话).如果我尝试将Arduino上的4个字节组合成一个long,它会给我一个错误的结果.
但是,如果我在PC上使用等效代码,我会得到正确的值.
输入为:0x12481248(0x12,0x48,0x12,0x48)(实际上是一个随机数).
Arduino给出:4680.
Code :: Blocks给出:306713160.
4680与0x1248相同,是在Arduino上使用int而不是long时得到的结果(省略2个字节).
Arduino代码:
void setup(){
Serial.begin(57600);
char read1 = 0x12;
char read2 = 0x48;
char read3 = 0x12;
char read4 = 0x48;
unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
unsigned long testint2 = 306713160;
Serial.println(testint);
Serial.println(testint2);
}
void loop(){}
Run Code Online (Sandbox Code Playgroud)
testint2表明它不是由Serial.println()引起的.串行监视器输出确实是:
4680
306713160
C++代码:
#include <iostream>
using namespace std;
int main(){
char read1 = 0x12;
char read2 = 0x48;
char read3 = 0x12;
char read4 = 0x48;
unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
cout << testint;
} …Run Code Online (Sandbox Code Playgroud) 为保护模式设置中断的过程是什么?
这个链接说应该:
- 为中断描述符表腾出空间
- 告诉CPU该空间在哪里(参见GDT教程:lidt的工作方式与lgdt完全相同)
- 告诉PIC您不再需要使用BIOS默认值(请参阅编程PIC芯片)
- 为IRQ和异常编写几个ISR处理程序(请参阅中断服务程序)
- 将ISR处理程序的地址放在适当的描述符中
- 启用IRQ掩码中所有支持的中断(PIC)
第三步对我来说毫无意义(我查看了这个链接,但没有任何关于告诉PIC的事情)所以我忽略了它并完成了接下来的两个步骤,当我到达最后一步时再次无能为力.但是,根据我对中断的理解,我不理解的两个步骤都与PIC控制器的硬件中断有关,不应该影响PIT在IRQ 0上引发的中断.因此我也忽略了这一步骤.
当我运行我的代码时,它编译得很好,甚至在虚拟机中运行,但中断似乎只发射一次.然后我意识到我没有向EOI发送EOI,以防止它再引发任何中断.但是,添加mov al, 0x20并out 0x20, al在iret指令之前使虚拟机崩溃.
这是我的IDT:
; idt
idt_start :
dw 0x00 ; The interrupt handler is located at absolute address 0x00
dw CODE_SEG ; CODE_SEG points to the GDT entry for code
db 0x0 ; The unused byte
db 0b11101001 ; 1110 Defines a 32 bit Interrupt gate, 0 is mandatory, privilege level = 0 (0b00), the last bit is …Run Code Online (Sandbox Code Playgroud) 我正在写一个程序,涉及网络I/O,所以send和recv使用,这是POSIX功能.它们返回a ssize_t,也是POSIX特有的.
包装器看起来像这个ATM:
ssize_t sock_send(int sock, const void* msg, size_t len) {
return send(sock, msg, len, 0);
}
Run Code Online (Sandbox Code Playgroud)
尽管我在当前的实现中严重依赖POSIX,但我希望使接口更贴近标准,因为我计划稍后编写一个Windows实现,其中POSIX不一定可用(该死的,Windows!).
ssize_t根据C11标准的规定,什么是一个很好的替代品?也许ptrdiff_t吧?
或者我该如何处理这个问题呢?
有这篇文章,最近收到了一些非常好的赞成票,询问了+C中的运营商.
它显示了以下实现:
// replaces the + operator
int add(int x, int y) {
while(x) {
int t = (x & y) <<1;
y ^= x;
x = t;
}
return y;
}
Run Code Online (Sandbox Code Playgroud)
巧合的是,我自己也写了一个实现(算法书练习),并提出了:
uint32_t bit_add(uint16_t a, uint16_t b) {
uint32_t carry = ((uint32_t) a & b) << 1;
uint16_t add = a ^ b;
return carry ^ add;
}
Run Code Online (Sandbox Code Playgroud)
我测试了几次它似乎工作.事实上,它比参考帖子的实现快得多,缺少x86上的任何跳转.
我的实施是正确的还是有什么不对的我不知道?
我无法想象我的代码比经常看到和审查的帖子的代码更快.
我有一个需要4-KiB对齐的数据结构.我可以使用强制执行此操作__attribute__ ((aligned (4096))).
问题是这种对齐要求会导致内存浪费.这是链接器放置符号的方式(pg_dir是对齐的数据结构):
00011000 <cursor_loc>:
00012000 <pg_dir>:
00013000 <idt>:
Run Code Online (Sandbox Code Playgroud)
cursor_loc只有四个字节.这会更好:
00011000 <pg_dir>:
00012000 <cursor_loc>:
00012008 <idt>:
Run Code Online (Sandbox Code Playgroud)
(这里idt必须是8字节对齐.)
您可以使用以下多个文件重现它:
test1.c:
char aligned[4096] __attribute__ ((aligned (4096)));
int i;
Run Code Online (Sandbox Code Playgroud)
test2.c:
int j;
int main(void) { }
Run Code Online (Sandbox Code Playgroud)
然后用它构建它
gcc test1.c test2.c
Run Code Online (Sandbox Code Playgroud)
并objdump -D a.out打印这个:
0000000000602004 <j>:
...
0000000000603000 <aligned>:
...
0000000000604000 <i>:
Run Code Online (Sandbox Code Playgroud)
如何移动GNU ld重新排列符号以减少空间浪费?我真的很想知道它为什么不自动完成.
我尝试扩大htop列的宽度。我在这里找到了一个解决方案,但它看起来非常具体而且也太困难了。有没有更简单的方法使一列中的所有字符都可见?
我试图直接写入物理内存位置,所以我使用汇编函数首先禁用分页,写入值,然后重新启用分页,但由于某种原因,在尝试编写时仍会触发页面错误值.
据我所知,在x86-32bit中,通过在cr0中翻转位32来设置打开和关闭分页,所以这是我的汇编函数:
mov 4(%esp), %ecx //address
mov 8(%esp), %edx //value
mov %cr0, %eax
and $0x7fffffff, %eax
mov %eax, %cr0
mov %edx, (%ecx) //this line still triggers a page fault somehow
or $0x80000000, %eax
mov %eax, %cr0
ret
Run Code Online (Sandbox Code Playgroud)
这是实现我想做的正确方法吗?如果是这样,为什么还会在cr0中的位翻转时触发页面错误?
我们知道在计算机上运行的所有内容都是由许多人合作的庞大程序.
因此,当计算机挂起而我们无法做任何事情时,会发生什么呢?此外,这个场景中的所有内容都冻结了程序中实现的内容吗?或者它是否像程序计数器卡住并且不能增加,因此处理器中存在一些问题?
在分析方阵乘法运行时,我了解到运行时是
对于朴素的分而治之的方法,和
对于施特拉森的方法。
为什么 N 除以 2 而不是 4?
我怎么理解,系数
(8 表示 naive,7 表示 Strassen)是每个级别引入的递归次数,或者子问题的增长率。除数是减少问题的因子。这
addend 是每个特定重复节点的运行时间。
如果朴素算法和施特拉森方法都将输出矩阵划分为
矩阵在哪里
是行数和列数,问题是不是减少了 4 倍而不是 2 倍,因为在每个级别我们都在解决 4 个较小矩阵的问题?
下面是我从 GeeksforGeeks 获得的天真方法的图像:
algorithm recursion divide-and-conquer matrix-multiplication