内存缓冲区解析

一.缓冲区顾名思义即为:内存中开辟的一片缓冲区域
  按类型分为:全缓冲,行缓冲,不带缓冲
  可以通过标准库函数setvbuf(_Inout_ FILE * _File, _Inout_updates_opt_z_(_Size) char * _Buf, _In_ int _Mode, _In_ size_t _Size);来设置缓冲区的类型
1.全缓冲:
  当当填满标准IO的缓存后才进行实际IO操作。
  windows和linux都可以通过给_Mode设为_IOFBF设置全缓冲。
  全缓冲的典型就是对磁盘文件的读写。
  缓冲区为空,一次读满数据,再写出。

windows下测试代码1:

 1 void main()
 2 {
 3     char buf[1024];//缓冲区大小为1024
 4     setvbuf(stdout, buf, _IOFBF, 1024);
 5     printf("中国女排很给力!\n\n");
 6     //while (1)
 7     //{
 8     //    printf("hello");
 9
10     //    Sleep(10);
11     //}
12     //setvbuf(stdout, NULL, _IONBF, 0);
13     system("pause");
14 }

结果:不会输出

测试代码2:

 1 void main()
 2 {
 3     char buf[1024];//缓冲区大小为1024
 4     setvbuf(stdout, buf, _IOFBF, 1024);
 5     printf("中国女排很给力!\n\n");
 6     while (1)
 7     {
 8         printf("hello");
 9
10         Sleep(10);
11     }
12     //setvbuf(stdout, NULL, _IONBF, 0);
13     system("pause");
14 }

结果:

2.行缓冲:
  在输入输出遇到换行符时,执行真正的IO操作。
  linux输出默认是行缓冲,以回车结束。windows没有行缓冲,不能设置,一旦设置变为全缓冲。
  设置行缓冲为:_IOLBF
  这时候输入的字符先存放至缓冲区,等按下回车键时才进行实际IO操作。
  典型代表就是键盘输入数据,每次读取一行。

windows下测试代码1:

 1 void main()
 2 {
 3     char buf[4096];
 4     setvbuf(stdout, buf, _IOLBF, 4096);
 5     printf("中国女排很给力!");
 6     //while (1)
 7     //{
 8     //    printf("hello");
 9     //}
10     //setvbuf(stdout, NULL, _IONBF, 0);
11     system("pause");
12 }

测试结果:不会直接打印出来,会输入缓冲区

windows下测试代码2:

 1 void main()
 2 {
 3     char buf[4096];
 4     setvbuf(stdout, buf, _IOLBF, 4096);
 5     printf("中国女排很给力!\n\n");
 6     //while (1)
 7     //{
 8     //    printf("hello");
 9     //}
10     //setvbuf(stdout, NULL, _IONBF, 0);
11     system("pause");
12 }

测试结果:可以看出设置行缓冲就是设置全缓冲,遇到换行符也不会输出。

windows下测试代码3:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<windows.h>
 4
 5 void main()
 6 {
 7     char buf[1024];//缓冲区大小为1024
 8     setvbuf(stdout, buf, _IOLBF, 1024);
 9     printf("中国女排很给力!\n\n");
10     while (1)
11     {
12         printf("hello");
13
14         Sleep(10);
15     }
16     setvbuf(stdout, NULL, _IONBF, 0);
17     system("pause");
18 }

测试结果:等缓冲区满后才一次性输出

3.不带缓冲区:
  直接进行实际的输入输出操作。
  windows默认输出不带缓冲,linux可以设置setvbuf(stdout, NULL, _IONBF, 0);而不带缓冲
  典型代表是标准错误stderr,这样可以使错误信息尽快显示出来

windows默认输出测试代码:

#include<stdio.h>
#include<stdlib.h>

void main()
{

    printf("中国女排很给力!");
    //setvbuf(stdout, NULL, _IONBF, 0);
    system("pause");
}

结果:直接输出,不带缓冲区。

时间: 2024-10-10 00:57:04

内存缓冲区解析的相关文章

X64下MmIsAddressValid的逆向及内存寻址解析

标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com/showthread.php?t=205143 在内核编程时,经常会用到MmIsAddressValid来检测地址是否有效,结合之前学过的虚拟地址到物理地址之间的转化,所以发一篇对该函数的逆向以及代码还原,x86的资料论坛以及网络有很多了,所以这里楼主只谈一下Win7 x64下的MmIsAddre

StringIO 模块用于在内存缓冲区中读写数据

模块是用类编写的,只有一个StringIO类,所以它的可用方法都在类中.此类中的大部分函数都与对文件的操作方法类似. 例: #coding=gbk import StringIO s=StringIO.StringIO("python a ,bu hao xue") s.write("python 2 \r\n") s.write('okok hello 中国') s.seek(0) print s.read() #最后4个字节 s.seek(-4,2) print

『Numpy』内存分析_numpy.dtype内存数据解析方式指导

numpy.dtype用于自定义数据类型,实际是指导python程序存取内存数据时的解析方式. [注意],更改格式不能使用 array.dtype=int32 这样的硬性更改,会不改变内存直接该边解析过程,导致读取出问题,所以使用 array.astype(int32) ,这样才安全. 一.基本使用示例 // 定义一个数据类型,其中name为16为字符串,grades为2个float64的子数组 >>> dt = np.dtype([('name', np.str_, 16), ('gr

C#内存管理解析

前言:对于很多的C#程序员来说,经常会很少去关注其内存的释放,他们认为C#带有强大的垃圾回收机制,所有不愿意去考虑这方面的事情,其实不尽然,很多时候我们都需要考虑C#内存的管理问题,否则会很容易造成内存的泄露问题. 尽管.NET运行库负责处理大部分内存管理工作,但C#程序员仍然必须理解内存管理的工作原理,了解如何高效地处理非托管的资源,才能在非常注重性能的系统中高效地处理内存.C#编程的一个优点就是程序员不必担心具体的内存管理,垃圾回收器会自动处理所有的内存清理工作.用户可以得到近乎像C++语言

程序(进程)内存分布解析【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/39498331 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这个沙盘就是虚拟地址空间(virtual address space),在32位模式下它总是一个4GB的内存地址块.这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用.每一个进程拥有一套属于它自己的页表,但是还有一个隐情.只要虚拟地址被使能,那么它就会作用于这台机器

C语言结构体占用空间内存大小解析

结构体的数据类型的有点我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧. 格式一: [cpp] view plain copy 01.struct tagPhone 02.{ 03.     char   A; 04.     int    B; 05.     short  C; 06.}Phone; [cpp] view plain copy 格式二: [cpp] view plain copy 01.struct tagPhone 02.{ 03.     char   A; 04

Linux内核中的内存屏障解析

缓存一致性 之前一直认为linux中很多东西是用来保证缓存一致性的,其实不是.缓存一致性绝大部分是靠硬件机制实现的,只有在带lock前缀的指令执行时才与cache有一点关系.(这话说得绝对,但我目前看来就是这样)我们更多的时候是为了保证顺序一致性. 所谓缓存一致性,就是在多处理器系统中,每个cpu都有自己的L1 cache.很可能两个不同cpu的L1 cache中缓存的是同一片内存的内容,如果一个cpu更改了自己被缓存的内容,它要保证另一个cpu读这块数据时也要读到这个最新的.不过你不要担心,这

ffmpeg解码内存缓冲区

只贴出部分代码,重在说明过程. 与解码文件的大致过程类似,只不过自定义了AVFormatContext struct IOData { char* data; size_t len; }; int FrVideoAcqHT::io_get_data(void *opaque, uint8_t *buf, int buf_size) { FrVideoAcqHT* acq = (FrVideoAcqHT*)opaque; //以下为通过缓冲区读文件解码方式 /*if (!feof(acq->f))

c++类内存分布解析

首先使用Visual Studio工具查看类的内存分布,如下: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局.近期的VS版本都支持这样配置. 下面可以定义一个类,像下面这样: 1 class Base 2 { 3 int a; 4 int b; 5 public: 6 void Comm