我见过程序员使用这个公式
mid = start + (end - start) / 2
Run Code Online (Sandbox Code Playgroud)
而不是使用更简单的公式
mid = (start + end) / 2
Run Code Online (Sandbox Code Playgroud)
用于查找数组或列表中的中间元素.
他们为什么使用前者呢?
为什么std::string尺寸由sizeof(std::string)屈服确定8?
我认为这应该不仅仅是8因为它必须有一个int(sizeof(int) == 8在我的机器上)数据成员给予std::string::length()和std::string::size()在O(1)和可能是一个char*字符.
我刚写了一个小程序,用C语言读取命令行参数,没什么太难的.我也在修改它们,例如将参数的第一个字符更改为大写.
我知道你不应该修改字符串文字,因为它可能导致未定义的行为,所以只是想知道*argv[]你不应该改变文字中的字符串.
int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud) 我们很快就会升级到VS2015,我在突破性更改列表中找到了这个:
const元素
C++标准始终禁止使用const元素的容器(例如vector或set).Visual C++ 2013及更早版本接受了这样的容器.在当前版本中,此类容器无法编译.
我想知道是否有人知道这是否也适用于一套.我知道地图仍然可以包含const指针作为键,因为它们无论如何都是const.
一个例子:
std::set<const QObject*>
Run Code Online (Sandbox Code Playgroud)
我还能这样做吗?根据微软网站上的帖子,我不这么认为.
我试图为没有复制构造函数的类实现移动构造函数.我收到一个错误,该类的成员的默认构造函数丢失.
这是一个简单的例子来说明这一点:
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)
为什么这是一个错误?有什么办法吗?
我写了一个简单的票证锁的简单实现.锁定部分看起来像:
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++中的语法错误还是语义错误?
int a = 7;
3 = a;
Run Code Online (Sandbox Code Playgroud)
在标准的C++无上下文语法中,我发现这个语句在语法上是有效的.
最近(2016年1月,如果问题持续时间足够长)我们有一个问题argv中的字符串是否可以修改?.
在这个答案的评论部分,我们(@ 2501和我)争论它是否真的是可修改的字符串(一个示例字符**argv)或指向字符串的指针(示例指针是*argv).
适当的标准报价来自C11标准草案N1570,§5.1.2.2.1/ 2:
数组指向的参数
argc和argv字符串argv应由程序修改,并在程序启动和程序终止之间保留它们最后存储的值.
那些argv可修改指向字符串的指针是什么?
在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地址线呢?
我听说MMU是由MMU维护而不是CPU缓存.
那么一个TLB是否存在于CPU上并且在所有处理器之间共享,或者每个处理器都有自己的TLB缓存?
有谁可以解释MMU和L1,L2缓存之间的关系?