恋恋风辰的个人博客


  • Home

  • Archives

  • Categories

  • Tags

  • Search

C++ 局部静态变量,全局变量,全局静态变量,局部变量的区别和联系

Posted on 2017-08-04 | In C++

C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。

从作用域看:

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序结束都一直存在,即它的生命周期是程序运行就存在,程序结束就结束,

他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。也就是在别的函数访问这个变量是错误的。

局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。

生命周期在函数结束后就结束了,作用域也仅限于该函数。

静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。

这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。

Read more »

TCP粘包处理

Posted on 2017-08-04 | In 网络编程

TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,

因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,

然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。即面向流的通信是无消息保护边界的。

UDP(user datagram protocol,用户数据报协议)是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法,

由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包,

在每个UDP包中就有了消息头(消息来源地址,端口等信息),这样,对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的。

Read more »

C++单例模式设计和实现

Posted on 2017-08-04 | In C++

C++单例模式主要用途就是整个程序中只实例化一个对象,之后获取到的都是该对象本身进行处理问题。

单例模式一般都是在函数中采用局部静态变量完成的,因为局部的静态变量生命周期是随着程序的生命周期

一起结束,所以不用担心会失效。另外局部的静态变量作用域仅限于该函数内部,别的函数不会直接使用。

第三点就是局部的静态变量跟所有的静态变量一样,放在全局区(静态区),只被初始化一次。

Read more »

Google protocol buffer的配置和使用(Linux&&Windows)

Posted on 2017-08-04 | In 网络编程

最近自己的服务器做到序列化这一步了,在网上看了下,序列化的工具有boost 和google的protocol buffer,protocol buffer的效率和使用程度更高效一些,就自己琢磨下把他加到自己的服务器里。所以这里我先弄一个小的demo去测试如何使用和配置protocol buffer。首先是windows 平台

windows下protocol buffer 配置:

  1. 下载protocol buffer, 去google官网或者其他渠道下载protocol buffer包

  2. 解压zip文件,进入vs文件夹编译protocol buffer,图示如下
    https://cdn.llfc.club/probuff1.png

    Read more »

C++的一些注意事项

Posted on 2017-08-04 | In C++

一. C++类的引用成员,类的常量成员,类的static成员的初始化方式

类的引用成员和常量成员初始化放在初始化列表里,因为初始化只有一次,需要在构造函数之前进行初始化,写在类的构造函数会出错。类的static变量要放在类声明的外边定义,因为static变量属于整个类,而不是类对象,所以不能放在类的构造函数里。
举个例子:
一个类中既有常量成员也有引用成员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass
{
public:
MyClass(int value):a(1),b(a), m_nValue(value),c(m_nValue),d(m_nValue){}
public:
const int a;
const int & b;
int & c;
const int &d;
int m_nValue;
static tms s;
static double f;
};

tms MyClass::s;
double MyClass::f = 0.33;
Read more »

windows多线程接口介绍和使用

Posted on 2017-08-03 | In 网络编程

一windows多线程接口:

1 创建线程

CreateThread 与 _beginthreadex都可以实现创建线程,两个函数的参数相同,

1
2
3
4
5
6
7
8
 HANDLEWINAPICreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes,
SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress,
LPVOIDlpParameter,
DWORDdwCreationFlags,
LPDWORDlpThreadId
);
Read more »

Windows互斥锁demo和分析

Posted on 2017-08-03 | In 网络编程

一:windows创建锁接口

创建互斥锁的方法是调用函数CreateMutex

1
2
3
4
5
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);

第一个参数是一个指向SECURITY_ATTRIBUTES结构体的指针,一般的情况下,可以是nullptr。

第二个参数类型为BOOL,表示互斥锁创建出来后是否被当前线程持有。

第三个参数类型为字符串(const TCHAR*),是这个互斥锁的名字,如果是nullptr,则互斥锁是匿名的。

例子:

HANDLE hMutex = CreateMutex(nullptr, FALSE, nullptr);

Read more »

windows环境利用semophore机制进行线程同步

Posted on 2017-08-03 | In 网络编程

semophore是信号量的意思,常用于PV操作,所谓PV操作就是pend(等待,直到有资源可用,并且消耗资源)V就是释放资源。
semophore和mutex区别,mutex本意为互斥,用于线程独占资源,常用于临界区访问锁住mutex,当线程A对mutex加锁后,其他线程不能反问临界资源,也不能加锁,直到线程A解锁,其他线程才能访问。而semophore则可以在不同的线程之间进行pv操作,semophore可以设置最多有多少个信号量,以及初始的信号量,当调用V操作的时候信号量数量增加一个,调用P操作时候信号量数量减少一个,但是不能超过最多的信号量。信号量是一个非负数。

Read more »

windows环境下封装条件wait和signal

Posted on 2017-08-03 | In 网络编程

linux 环境有提供好的pthread_cond_wait() 和 phread_signal()、pthread_broadcast()windows需要自己封装,利用semophore控制线程等待和释放,先简单谈一下设计好后api该如何使用。假设我们封装好条件变量等待函数名字叫做wait(Mutex& mutex),Mutex是之前我们封装的条件变量,文章最下边会给出这些文件的下载地址,在这里读者当做linux 的mutex即可。我们封装的释放函数为signal(),广播函数为broadcast。

Read more »

C++类成员空间分配和虚函数表

Posted on 2017-08-03 | In C++

最近在自学python,看到继承和类,就顺便复习了C++的类和继承等方面的知识。
先看Base基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Base {

private:

virtual void display() { cout<<"Base display()"<<endl; }

void say(){ cout<<"Base say()"<<endl; }

public:

virtual void func(){cout << "Base func()" << endl; }
void exec(){ display(); say(); }

void f1(string a) { cout<<"Base f1(string)"<<endl; }

void f1(int a) { cout<<"Base f1(int)"<<endl; } //overload

};
Read more »
<1…3637

370 posts
17 categories
21 tags
RSS
GitHub ZhiHu
© 2025 恋恋风辰 本站总访问量次 | 本站访客数人
Powered by Hexo
|
Theme — NexT.Muse v5.1.3