C++太可怕了哈求安慰

要将china译成密码规律是:用原来字母后面的第四个字母代替原来的字母


    char p[] = "china";
    for (int i = 0; p[i] != '\0'; i++)
        p[i] += 4;
    puts(p);
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7793780
  • 这篇博客也不错, 你可以看下编译原理——词法分析程序的设计与C++代码实现
  • 除此之外, 这篇博客: 【C++后台开发面经】面试总结第八波:整个知识的查漏补缺中的 原子类型和原子操作 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 原子操作:多个线程访问同一个资源时,有且仅有一个线程对资源进行操作。可以通过加锁保证。

    C++新增了原子类型:atomic_llong、atomic_int等,它们都是用atomic<T>模板定义的,例如std::atomic_llong就是用std::atomic<long long>来定义的。C++11中将原子操作定义为atmoic模板类的成员函数,包括大多数类型的操作,比如读写、交换等。对于内置类型,主要通过重载全局操作符来实现。 operator+=()函数会产生一条特殊的以lock为前缀的x86_64指令,用于控制总线及实现x86_64平台上的原子性加法。

    atomic_flag一种简单的原子布尔类型,只支持两种操作:test_and_set和clear

    使用ATOMIC_FLAG_INIT宏初始化,可以保证该对象创建处于clear状态。

    CPU指令是多线程不可再分的最小单位,如果我们有办法将代码语句和指令对应起来,就不需要引入互斥锁从而提高性能?而这个对应关系就是所谓的原子操作,C++11中的atomic中有两种做法:1)模拟,对于一个atomic<T>类型,可以给他附带一个mutex,操作时lock/unlock一下,这种在多线程下进行访问,必然会导致线程阻塞;2)有相应的CPU层级的对应,这就是一个标准的lock-free类型。

    例如:在执行自增操作的时候,在xaddl指令前多了一个lock前缀,而CPU对这个lock指令的支持就是所谓的底层硬件支持,增加了这个前缀后,保证了load-add-store步骤的不可分割性。

    lock指令的实现

    CPU在执行任务的时候并不是直接从内存中加载数据,而是会先把数据加载到L1和L2的cache中(典型的是两层缓存,甚至更多),然后再从cache中读取数据进行运算。

    现在计算机通常都是多核处理器,每个内核都对应一个独立的L1层缓存,多核之间的缓存数据同步是CPU框架设计的重要部分,MESI是比较常用的多核缓存同步方案。当我们在单线程内执行atomic++操作,自然不会发生多核之间数据不同步的问题,但是我们在多线程多核的情况下,cpu是如何保证lock特性呢?

    以intel x86架构的cpu为例:lock前缀实现原子性的两种方式:1)锁bus:性能消耗大,在intel 486处理器上用此种方式实现;2)锁cache:在现代处理器上使用此种方式,但是无法锁定cache的时候(如果锁驻留在不可缓存的内存种,或者锁超出了划分cache line的cache body),任然会去锁定总线。