小编cad*_*luk的帖子

为什么在计算数组的中间时更喜欢start +(end-start)/ 2 over(start + end)/ 2?

我见过程序员使用这个公式

mid = start + (end - start) / 2
Run Code Online (Sandbox Code Playgroud)

而不是使用更简单的公式

mid = (start + end) / 2
Run Code Online (Sandbox Code Playgroud)

用于查找数组或列表中的中间元素.

他们为什么使用前者呢?

c algorithm

159
推荐指数
3
解决办法
9546
查看次数

为什么sizeof(std :: string)只有八个字节?

为什么std::string尺寸由sizeof(std::string)屈服确定8
我认为这应该不仅仅是8因为它必须有一个int(sizeof(int) == 8在我的机器上)数据成员给予std::string::length()std::string::size()在O(1)和可能是一个char*字符.

c++

31
推荐指数
2
解决办法
9644
查看次数

argv中的字符串是否可修改?

我刚写了一个小程序,用C语言读取命令行参数,没什么太难的.我也在修改它们,例如将参数的第一个字符更改为大写.

我知道你不应该修改字符串文字,因为它可能导致未定义的行为,所以只是想知道*argv[]你不应该改变文字中的字符串.

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

c string argv command-line-arguments

26
推荐指数
1
解决办法
1651
查看次数

Visual Studio 2015:是否允许一组const指针?

我们很快就会升级到VS2015,我在突破性更改列表中找到了这个:

const元素

C++标准始终禁止使用const元素的容器(例如vector或set).Visual C++ 2013及更早版本接受了这样的容器.在当前版本中,此类容器无法编译.

资源

我想知道是否有人知道这是否也适用于一套.我知道地图仍然可以包含const指针作为键,因为它们无论如何都是const.

一个例子:

std::set<const QObject*>
Run Code Online (Sandbox Code Playgroud)

我还能这样做吗?根据微软网站上的帖子,我不这么认为.

c++ containers pointers c++11 visual-studio-2015

18
推荐指数
1
解决办法
2645
查看次数

为什么移动构造函数需要其成员的默认构造函数?

我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.

这是一个简单的例子来说明这一点:

struct A {
public:
        A() = delete;
        A(A const&) = delete;
        A(A &&a) {}
};

struct B {
        A a;
        B() = delete;
        B(B const&) = delete;
        B(B &&b) {}
};
Run Code Online (Sandbox Code Playgroud)

试着编译这个,我得到:

move_without_default.cc: In constructor ‘B::B(B&&)’:
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’
  B(B &&b) {}
           ^
move_without_default.cc:6:2: note: declared here
  A() = delete;
  ^
Run Code Online (Sandbox Code Playgroud)

为什么这是一个错误?有什么办法吗?

c++ default-constructor move-constructor

18
推荐指数
3
解决办法
1437
查看次数

使用atomics实现票证锁会产生额外的mov

我写了一个简单的票证锁的简单实现.锁定部分看起来像:

struct ticket {
    uint16_t next_ticket;
    uint16_t now_serving;
};

void lock(ticket* tkt) {
    const uint16_t my_ticket =
        __sync_fetch_and_add(&tkt->next_ticket, 1); 
    while (tkt->now_serving != my_ticket) {
        _mm_pause();
        __asm__ __volatile__("":::"memory");
    }   
}
Run Code Online (Sandbox Code Playgroud)

然后我意识到,不是使用gcc内在,我可以用std::atomics 写这个:

struct atom_ticket {
    std::atomic<uint16_t> next_ticket;
    std::atomic<uint16_t> now_serving;
};

void lock(atom_ticket* tkt) {
    const uint16_t my_ticket =
        tkt->next_ticket.fetch_add(1, std::memory_order_relaxed);
    while (tkt->now_serving.load(std::memory_order_relaxed) != my_ticket) {
        _mm_pause();
    }   
}
Run Code Online (Sandbox Code Playgroud)

这些生成几乎相同的程序集,但后者生成一个附加movzwl指令.为什么有这个额外的mov?有没有更好,更正确的写作方式lock()

装配输出-march=native -O3:

 0000000000000000 <lock(ticket*)>:
    0:   b8 01 00 …
Run Code Online (Sandbox Code Playgroud)

c++ x86 multithreading locking

16
推荐指数
1
解决办法
1089
查看次数

为恒定语法或语义错误分配值?

第二行代码是C++中的语法错误还是语义错误?

 int a = 7;
 3 = a;
Run Code Online (Sandbox Code Playgroud)

在标准的C++无上下文语法中,我发现这个语句在语法上是有效的.

c++ compiler-construction syntax-error lvalue

8
推荐指数
1
解决办法
168
查看次数

argv中指向字符串的指针是否可修改?

最近(2016年1月,如果问题持续时间足够长)我们有一个问题argv中的字符串是否可以修改?.
这个答案的评论部分,我们(@ 2501和我)争论它是否真的是可修改的字符串(一个示例字符**argv)或指向字符串指针(示例指针是*argv).

适当的标准报价来自C11标准草案N1570,§5.1.2.2.1/ 2:

数组指向的参数argcargv字符串 argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.

那些argv可修改指向字符串的指针是什么?

c pointers argv language-lawyer

8
推荐指数
1
解决办法
214
查看次数

为什么在保护模式下启用A20线路?

在Linux 0.01的引导加载程序的汇编源文件中,启用了A20行.

来自boot/boot.s:

| that was painless, now we enable A20

call     empty_8042
mov al,#0xD1

...
Run Code Online (Sandbox Code Playgroud)

然后,引导加载程序跳转到保护模式.

在实模式下,启用A20线路可以为我们提供64 KiB - 16字节的地址空间扩展.
在保护模式下,地址总线自动解锁.

当跳转到保护模式时,为什么引导加载程序会启用A20地址线呢?

linux x86 assembly operating-system linux-kernel

7
推荐指数
1
解决办法
1057
查看次数

TLB是在多个核心之间共享的吗?

我听说MMU是由MMU维护而不是CPU缓存.
那么一个TLB是否存在于CPU上并且在所有处理器之间共享,或者每个处理器都有自己的TLB缓存?

有谁可以解释MMU和L1,L2缓存之间的关系?

x86 caching tlb

7
推荐指数
1
解决办法
2537
查看次数