'/usr/include/c++/4.4/bits/'中位的含义是什么?
Linux,gcc当然.
例如,在<algorithm>中,函数equal_range返回pair,因此我可以假设,如果我#include <algorithm>,<utility>是#included?
使用gcc/g ++编译C/C++代码时,如果它忽略了我的寄存器,它可以告诉我吗?例如,在此代码中
int main()
{
register int j;
int k;
for(k = 0; k < 1000; k++)
for(j = 0; j < 32000; j++)
;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
j将用作寄存器,但在此代码中
int main()
{
register int j;
int k;
for(k = 0; k < 1000; k++)
for(j = 0; j < 32000; j++)
;
int * a = &j;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
j将是一个正常变量.它可以告诉我我使用寄存器的变量是否真的存储在CPU寄存器中?
gcc似乎在告诉我int foo(int (*f)(void))和int foo(int (f)(void))
f指向函数的指针是一样的,它不返回任何参数int.为什么我们可以省略*这里.
不过,我也尝试过int (*p)(void)和int (p)(void).第一个p是函数指针,第二个是函数.
那么,发生了什么?在什么情况下可以省略星号?我在K&R中查找并没有发现任何东西.
根据手册页getaddrinfo(3),我需要
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
Run Code Online (Sandbox Code Playgroud)
使用该功能getaddrinfo.或者,根据标准:
#include <sys/socket.h>
#include <netdb.h>
Run Code Online (Sandbox Code Playgroud)
我明白我需要的东西像AF_INET和SOCK_STEAM从<sys/socket.h>.但我仍然有以下问题.
假设我只使用该getaddrinfo功能,我是否#include <sys/socket.h>必须符合标准?如果是这样,为什么不<netdb.h>包括它呢?如果没有,为什么手册页会在概要中包含它?
在学习汇编时,我意识到我应该将经常访问的数据放在寄存器中而不是内存中,因为内存要慢得多。
问题是,由于首先要从内存中获取指令,CPU如何比内存运行得更快?CPU通常会花费大量时间等待内存中的指令吗?
编辑:要运行程序,我们需要将其编译为包含机器代码的文件。然后,我们将该文件加载到内存中,然后逐条执行一条指令。CPU需要知道要运行的指令,然后从内存中获取那条信息。我不是在问要处理数据,而是要从内存中读取指令的过程。对不起,如果我不够清楚。
编辑2:
示例:在我的计算机上xor eax, eax编译为31c0。我知道这条指令本身很快。但是要清除eax,CPU需要31c0首先从内存中读取。如果访问内存的速度很慢,那么读取操作将花费大量时间,而在此期间,CPU只是停顿了?
#include <cstdio>
#include <cstring>
class A
{
public:
virtual void foo()
{
puts("A");
}
};
class B : public A
{
public:
void foo()
{
puts("B");
}
};
int main()
{
A a;
B b;
memcpy(&a, &b, sizeof (b));
(&a)->foo();
}
Run Code Online (Sandbox Code Playgroud)