当前位置:首页 » 编程语言 » c语言怎么把东西放入高速缓存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言怎么把东西放入高速缓存

发布时间: 2022-07-03 03:30:02

c语言缓冲区在哪里

缓冲区具体在哪里是与操作系统、编译器相关的
以VC++为例。察看getchar的源代码(src\fgetchar.c),有:
int __cdecl _fgetchar (void){
return(getc(stdin));
}
#undef getchar
int __cdecl getchar (void){
return _fgetchar();
}
可见getchar()相当于getc(stdin)

继续察看getc(src\fgetc.c),有一段(为便于阅读,有删减):
int __cdecl getc (FILE *stream){
int retval;
_ASSERTE(stream != NULL);
_lock_str(stream);
__try {
retval = _getc_lk(stream);
}
__finally {
_unlock_str(stream);
}
return(retval);
}

这段代码里_lock_str其实是通过Win32 API提供的临街区来锁住文件
接收用户输入发生在_getc_lk,_getc_lk宏调用_filbuf。_filbuf在_filbuf.c中可以查看,这段代码比较长,就不贴出来了
_filbuf主要是调用了_read(_fileno(stream), stream->_base, stream->_bufsiz)

而_read最终则是调用了Win32API ReadFile,以下是用WinDbg输出的getchar的调用栈:
# ChildEBP RetAddr
00 0012fe6c 0040a4e7 kernel32!ReadFile
01 0012fea8 0040a3b9 TestStruct!_read_lk+0x107 [read.c @ 146]
02 0012fec0 00403140 TestStruct!_read+0x69 [read.c @ 75]
03 0012fee8 00401290 TestStruct!_filbuf+0xd0 [_filbuf.c @ 127]
04 0012ff08 004012cc TestStruct!fgetc+0x80 [fgetc.c @ 44]
05 0012ff14 0040103d TestStruct!getc+0xc [fgetc.c @ 56]
06 0012ff20 00401058 TestStruct!_fgetchar+0xd [fgetchar.c @ 37]
07 0012ff28 0040101e TestStruct!getchar+0x8 [fgetchar.c @ 47]
08 0012ff80 0040115c TestStruct!main+0xe [d:\my programs\teststruct\ts.cpp @ 4]
09 0012ffc0 7c816fe7 TestStruct!mainCRTStartup+0xfc [crt0.c @ 206]
0a 0012fff0 00000000 kernel32!BaseProcessStart+0x23

可见,getchar最终调用了ReadFile。关于ReadFile的原理以及缓冲区在哪里,请你再提一个问我再回答

② C语言 读取文件到内存

1.文件的大小。

文件大小:该文件所占的存储空间的大小,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍,比如1KB=1024B,1M=1024KB。

2.是否可以不预先分配内存。

可以不预先分配跟文件大小一致的内存,但是从文件中读出的每一行都要分配一个内存,可以为每一行设定一个固定的内存大小,比如A字节,然后用C语言的malloc函数为该行数据分配内存,读出数据后,判断分配的内存是否够用,如果不够用,可以用C语言的realloc函数对该块内存进行再分配。

malloc函数

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

void* 类型表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。

realloc函数

realloc的全程是reset allocation,中文名叫动态内存调整,用于调整一块连续的已分配的内存块区域。

3.数组和struct结构体的建立。

double数组:double a[100];

字符数组:char a[100];

struct结构体:

structst{

double a[100];

char b[100];

};



③ c语言传文件清空缓存

scanf("%*[^\n]");
^取反或者“非”,[^\n]就是除了回车什么都可以被scanf读到。*表示被读到了但是不把读到值或者字符赋值给任何变量。
%*[^\n]就是读取来自键盘的出去回车外的任意字符,并不赋值给变量。
scanf("%*c");
就一个*,和上边表示一样就是读到了不赋值给任何变量。

再看,scanf("%[^\n]%*c",str)读入一行字符,赋值给str变量。如果c前面没有*,那么就需要str后面再写一个char类型的ch。这就告诉*表示读到了但是不赋值给任何变量。
那么scanf("%*[^\n]%*c")这句话,应该能理解了,两个格式控制符里面都有*,就是都读到了都不赋值变量。

读到这里应该差不多理解了,就是题中的两句scanf(相当于scanf("%*[^\n]%*c"))读到了输入的abc,但是没有赋值给任何变量。然后到了gets(str4);读到了def赋值给str4,然后printf("%s\n", str4);后必然显示def。

清空缓存区用fflush(stdin);这句代码。
键盘输入的东西都是放在缓冲区的这款区域,有变量过来了就带走,没有变量就在那里呆着等待一个变量来带它走。但是这个时候缓冲区里面偶尔会有一些垃圾的字符,而影响了正常的输入,有的时候用getchar()带走一个两个的字符,但是如果还是不见效一句fflush(stdin);就可以了。

④ [C++]请具体、详细地解释下什么是【刷新输出缓冲】。燃眉之急,万分感谢!!

刷新输出缓冲区
这个问题要先了解C++的输出实现方式。
如果是输出到终端(简单举例就算是屏幕上),一般不需要刷新缓冲区,因为会即时输出到终端;
如果输出到文件,由于文件操作速度很慢,一般是先保存在一个输出缓冲区内。你可以想象成你申请了一段内存,输出到文件时会先往这段内存里写,一旦这段内存写满了,就立刻把内存中所有的内容一次性写入文件,然后再重新填充缓冲区。除了缓冲区已满,关闭已打开的文件时也会自动刷新。

在你的问题中,就是在输出了一个换行后,让程序刷新一下缓冲区,就是无论缓冲区是否已满,都让他直接写入到文件中,而不去等待下一次输出。其实,只要调用一个函数即可做到。

stream << std::endl; //stream是你打开的文件流,这个你应该明白哈
stream.flush();// 刷新缓冲区,这个就是刷新缓冲区

不明白可以继续追问

⑤ C语言高速读大文件、写大文件的方式

写文件一般是追加快些
如果你要输出例如XML。
还有,每个进程应该有4G,靠操作系统内存管理+页面文件维持、
还有,开个几百M的数组不划算、用malloc+free快些,可以动态的,不让操作系统在加载时就开辟几百M,而是陆续的开——除非你在写汇编程序——汇编向OS申请内存很费劲,要 SYSCALL

⑥ C/C++如何准确的将代码片段放入指定的高速缓冲区中并使其内存溢

第一次听说有人想将高速缓冲区溢出!
要做这一点我想需要瞭解具体的芯片架构,intel会有这方面的芯片介绍。
其次就是瞭解操作系统的机制。
弱弱说句:高速缓存是由芯片硬件部件控制的,哪些内存经常访问,就会将哪些内存同步到高速缓存,甚至于操作系统都没法控制。高速缓冲区不存在溢出的问题。
以上是个人有限的最新intel芯片多核架构知识和有限的操作系统知识得出的结论,阿门。。。。

⑦ C语言里如何设置缓冲区,

很简单的定义一个数组,用两个变量下标来指向头和尾,新数据来尾++ 老数据处理完头++ 两个下标超过界限时从头开始循环利用 中间要考虑缓存数据空和数据满的情况

或者你动态分配空间,来一个信号分配空间,插入队列链表,处理完一个出队列,释放空间