• volatile只能保证被其修饰变量的内存可见性(线程B 总能得到线程
    A 中最新的共享变量),但如果对该变量执行的是非原子操作线程依旧是不安全的
没有 volatile 时,线程A 会将操作结果写到 CPU 缓存中,而不是内存中,有机会的时候(比如,CPU 缓存不够用的时候),才会将 CPU 缓存中的内容存到内存,存到内存以后,其他线程就可以看到了。
而 volatile 将结果写入 CPU 缓存的同时,就会将结果写入到内存中。
static 修饰的变量在程序中只会初始化一次,在线程间共享,理论上,在某一个线程中修改了变量,其他的线程会马上发现。但是,为了提高优化速度和运行速度,一个线程修改这个变量是不一定立即写回内存让其它线程看到的,这时候就需要用volatile强制要求每次改变都写回内存了。
  • synchronized既可以保证其修饰范围内存可见性和操作的原子性,所以synchronized是线程安全的

参考链接:https://www.cnblogs.com/howo/p/8525665.html

1.c++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
2.一般来说,如果你认为变量是一个常量表达式,那就把它声明为constexpr类型。

int sth(){
return 4;
}
const int n=sth();

不能通过编译

constexpr int sth(){
return 4;
}
const int n=sth();

可以通过编译

#pragma push_macro(" ")
...
# undef ..
# pragma pop_macro(" ")

将宏定义 go 压入栈
取消它的定义(go 本来含义便获得了恢复)
将宏定义 go 弹出栈,恢复宏定义

#include <iostream>

#define double float
using namespace std;


int main() {
    double a = 1.5688958778877;
    cout << sizeof(a) << endl;
    #pragma push_macro("double")
    #undef double
        double b = 1.5688958778877;
        cout << sizeof(b) <<endl;
    #pragma pop_macro("double")
    double c =1.5688958778877;
    cout << sizeof(c) <<endl;
    return 0;
}

4
8
4

libcurl主要功能就是用不同的协议连接和沟通不同的服务器

libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证

还在学,还没整明白!