sizeof

2020.01-Study_update

元气小坏坏 提交于 2020-01-11 04:57:21
2020 1月6日 First_week 1.6-1.12 - Study_update Mon. 递增和递减运算符①,条件运算符 cond?:expr1:expr2② Tue. 位运算符(未搞懂),二进制(了解),模板①,函数模板②,,sizeof运算符③,逗号运算符 Wed. 类型转换(命名的强制类型转换)① Thur. 简单语句,语句作用域,条件语句,if Fri switch①,迭代语句while②, Sat Sun. 1.6 Monday ①除非必须,否则不用递增递减运算符后置版本,因为后置版本需要存储原始值以便于返回这个未修改的内容,这会对性能有一定影响。 ②条件运算符可以嵌套。但是随着嵌套的层数增加,代码可读性急剧下降。 # include "pch.h" # include <iostream> # include <string> using namespace std ; int main ( ) { cout << "请输入成绩" << endl ; int input ; while ( cin >> input && input <= 100 ) { string str ; str = input > 90 ? "优秀" : input > 60 ? "及格" : "不及格" ; //条件运算符嵌套 cout << str ; } } //洋葱骑士

socket采用epoll编程demo

北城以北 提交于 2020-01-10 23:01:04
epoll工作流程 首先,需要调用epoll_create创建epoll; 此后我们就可以进行socket/bind/listen; 然后调用epoll_ctl进行注册; 接下来,就可以通过一个while(1)循环调用epoll_wait来等待事件的发生; 然后循环查看接收到的事件并进行处理; 1)如果事件是sever的socketfd我们就要进行accept,并且把接收到client的socketfd加入到要监听的事件中; 2)如果在监听过程中,需要修改操作方式(读/写),可以调用epoll_ctl来重新修改; 3)如果监听到某一个客户端关闭,那么我就需要再次调用epoll_ctl把它从epoll监听事件中删除。 epoll的结构体 typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/epoll.h

c中结构体数据对齐问题

百般思念 提交于 2020-01-10 14:07:34
1.为什么需要数据对齐 提升CPU读取数据的效率。CPU每次都是从以4字节(32位CPU)或是8字节(64位CPU)的整数倍的内存地址中读进数据的(例如32位的只能0x00000004、0x00000008这种地址一次读4字节的数据)。如果数据不对齐,例如一个int类型放在0x00000004、0x00000008这两个内存地址中间,CPU就会多次读取,如果把整形对齐存放在0x00000008就可以一次读取出来。 2.分析(编译器:Dev 电脑:64位) 我们用创建结构体然后用sizeof打印出结构体大小方式来验证数据对齐方式 正式开始,定义一个char和int,如果不对齐sizeof的结果应该是5,看结果 结果是8,将char于int类型补齐,即对char补齐了3个字节。结果是(1+ 3 )+4=8. (注:所有计算试中斜体加粗数据为补齐用) 如果再往后面添加一个数据呢? 依旧会将最后一个char进行数据对齐,结果为(1+ 3 )+4+(1+ 3 )=12 我们将c换到中间去,结果是否还是12呢? 结果变成了8,原因是a和c所需的空间为2,不需要各自补齐3个空间。结果为((1+1)+ 2 )+4=8 那对字符数组呢? 把a[5]直接拆开成5个char类型即可,结果为((1+1+1+1+1)+ 3 )+4=12. 可以做一个小结: 可以发现,

套接字(socket)编程简单实现server-client聊天程序

白昼怎懂夜的黑 提交于 2020-01-10 07:10:10
1、socket 在TCP/IP协议中,一个IP地址标识网络通讯中唯一一台主机,而一个IP地址+一个TCP(或UDP)端口号就可以标识网络通讯中的一个进程,此时的IP地址+端口号即称为socket。 内存中的多字节数据相对于内存地址有大小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大小端之分,网络数据流同样也有大小端之分:先发出的数据是低地址,后发出的数据是搞地质,TCP/IP协议规定网络数据流采用大端字节序,即低地址高字节。 1)计算机分为大端机和小端机,那么如何使同样的C代码在大端机和小端机上都能正常运行呢?库函数一节为我们提供了转换的接口: include<arpa/inet.h> unit32_t htonl(unit32_t hostlong);//32位的长整数从主机字节序转换为网络字节序 unit16_t htons(unit16_t hostshort);//16位的短整数从主机字节序转换为网络字节序 unit32_t ntohl(unit32_t netlong);//32位的长整数从网络字节序转换为主机字节序 unit16_t ntohs(unit16_t netshort);//16位的短整数从网络字节序转换为主机字节序 2)由于网络传输是二进制比特流传输

libevent中的bufferevent原理

你离开我真会死。 提交于 2020-01-10 03:27:14
以前的文章看过缓冲区buffer了,libevent用bufferevent来负责管理缓冲区与buffer读写事件。 今天就带大家看下evbuffer.c,使用bufferevent处理事件的数据,是buffer和event的综合。在最后用一个稍微综合的例子看下使用bufferevent的整个流程。   首先依旧看下bufferevent的结构。结构很清晰。源码版本1.4.14。    1 struct bufferevent { 2 struct event_base *ev_base; 3 4 //读事件 5 struct event ev_read; 6 //写事件 7 struct event ev_write; 8 //读缓冲区,输入缓冲 9 struct evbuffer *input; 10 //写缓冲区,输出缓冲 11 struct evbuffer *output; 12 13 //读水位 14 struct event_watermark wm_read; 15 //写水位 16 struct event_watermark wm_write; 17 18 //发生读触发用户设置的回调 19 evbuffercb readcb; 20 //发生写触发用户设置的回调 21 evbuffercb writecb; 22 //发生错误触发用户设置的回调 23

数组如何作为形参传给函数?

我是研究僧i 提交于 2020-01-10 01:10:38
数组如何作为形参传给函数? 刚学c++,对这方面也了解的不深入,写的可能有些不对,希望指点! 关于这个问题,可以说一直纠结了我许久,每次我想用数组作为形参传给函数时,发现总是出错,今天又遇到这个问题了,我就来分享下我的思路。 我是想写一个函数用于数组排序用的;传入的数组大小不确定,于是我想用 sizeof(a)/sizeof(a[0]) 方法测出数组的长度,后来测试,在函数里面测出实参的长度行不通。经过百度查询,终于弄清楚了。 原因:有两种传递方法,一种是function(int a[]); 另一种是function(int *a,int m(数组的大小)) 这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值! 对于第一种,根据之前所学,形参是实参的一份拷贝,是局部变量。但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。所以,这里也不能在函数内部用sizeof求数组的大小,必须在外面算好了再传进来。为了方便,下面分析方法二。 实例: void pai(int a[],int m) { int tem; for (int i=0;i<m;i++) { int mix=i; for(int j

sizeof数组大小有不同

你离开我真会死。 提交于 2020-01-09 16:42:37
直接上代码: 1 using namespace std; 2 3 int main(){ 4 5 int isize = 0; 6 int num[5] = { 1, 2, 3, 4, 5 }; 7 char szChar[5] = "love"; 8 char szStr[5] = { 'l', 'o', 'v', 'e', 'u' }; 9 isize = sizeof(num);//20 10 isize = sizeof(szChar);//5 11 isize = sizeof(szStr);//5 12 return 0; 13 } 来源: https://www.cnblogs.com/mktest123/p/12171927.html

如何从进程内部确定CPU和内存消耗?

泪湿孤枕 提交于 2020-01-09 11:35:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我曾经负责从运行的应用程序内部确定以下性能参数的任务: 可用虚拟内存总量 当前使用的虚拟内存 我的进程当前使用的虚拟内存 总可用RAM 当前使用的RAM 我的进程当前使用的RAM 当前使用的CPU百分比 我的进程当前使用的CPU百分比 该代码必须在Windows和Linux上运行。 尽管这似乎是一项标准任务,但在手册(WIN32 API,GNU文档)以及Internet上找到必要的信息还是花了我几天的时间,因为关于该主题的信息太多,不完整/不正确/过时发现在那里。 为了使其他人免于遭受同样的麻烦,我认为将所有分散的信息以及通过反复试验发现的信息收集到一个地方是一个好主意。 #1楼 在Windows中,您可以通过以下代码获取cpu的使用情况: #include <windows.h> #include <stdio.h> //------------------------------------------------------------------------------------------------------------------ // Prototype(s)... //-------------------------------------------------------------

给rar文件加个自定义头

▼魔方 西西 提交于 2020-01-09 11:21:38
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) btn1: TButton; btn2: TButton; edt2: TEdit; lbl1: TLabel; dlgOpen1: TOpenDialog; procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); var i:Integer; sFile:string; ms:TMemoryStream; buf:string; begin ms:= TMemoryStream.Create; try if dlgOpen1.Execute then begin sfile:=

Does a flexible array member increase sizeof a struct?

浪尽此生 提交于 2020-01-09 11:05:56
问题 I have the following kind of code: typedef struct { u32 count; u16 list[]; } message_t; ... message_t* msg = (message_t*)buffer; msg->count = 2; msg->list[0] = 123; msg->list[1] = 456; size_t total_size = sizeof(*msg) + sizeof(msg->list[0]) * msg->count; send_msg( msg, total_size ); Problematic line is the line with sizeofs. I am not sure is that correct way to count needed space. Does sizeof(*msg) contains already something about the list member? I can test it with my compiler, but does