相关疑难解决方法(0)

最终C++书籍指南和列表

这个问题试图收集每年出版的数十本不良C++书籍中的少数珍珠.

与许多其他编程语言不同,这些编程语言经常从互联网上的教程中随处获取,很少有人能够快速学习C++,而无需学习编写精良的C++书籍.这样做太复杂了.事实上,它是如此庞大和复杂,有很多非常糟糕的C++书籍.我们并不是在谈论糟糕的风格,而是体育明显的事实错误促进糟糕的编程风格.

请编辑接受的答案,以提供高质量的书籍和近似的技能水平 - 最好 C++聊天室讨论您的添加.(如果他们不同意建议,常客可能会毫不留情地撤销你的工作.)添加一篇关于你亲自阅读/受益的每本书的简短描述/描述.随意讨论质量,标题等.符合标准的书籍将被添加到列表中.由C和C++用户协会(ACCU)撰写评论的图书都有指向评论的链接.

*注意:常见问题和其他资源可以在C++标签信息.

c++ c++-faq

4246
推荐指数
1
解决办法
224万
查看次数

如何编写最能利用CPU缓存来提高性能的代码?

这听起来像是一个主观问题,但我正在寻找的是特定的实例,你可能遇到过与此相关的问题.

  1. 如何制作代码,缓存有效/缓存友好(更多缓存命中,尽可能少的缓存未命中)?从两个角度来看,数据缓存和程序缓存(指令缓存),即一个代码中与数据结构和代码结构相关的内容,应该由一个人来处理,使其缓存有效.

  2. 是否有必须使用/避免的特定数据结构,或者是否有特定方式来访问该结构的成员等...以使代码缓存有效.

  3. 是否存在任何程序结构(if,for,switch,break,goto,...),代码流(对于if内部,如果在for之内等等),应该遵循/避免这个问题?

我期待听到有关制作缓存高效代码的个人经验.它可以是任何编程语言(C,C++,汇编,...),任何硬件目标(ARM,Intel,PowerPC,...),任何操作系统(Windows,Linux,S ymbian,...)等. .

这种变化将有助于更好地理解它.

performance caching cpu-cache

155
推荐指数
10
解决办法
6万
查看次数

java howto ArrayList push,pop,shift和unshift

我已经确定Java ArrayList.add类似于JavaScriptArray.push

我一直在寻找ArrayList类似于以下的功能

  • Array.pop
  • Array.shift
  • Array.unshift 我倾向于 ArrayList.remove[At]

java arraylist

74
推荐指数
4
解决办法
14万
查看次数

c ++ Vector,每当它在堆栈上扩展/重新分配时会发生什么?

我是C++的新手,我在项目中使用了矢量类.我发现它非常有用,因为我可以有一个数组,只要有必要就会自动重新分配(例如,如果我想推送一个项目并且向量已达到它的最大容量,它会重新分配自己,为操作系统提供更多的内存空间),所以对向量元素的访问非常快(它不像列表,要达到"第n"元素,我必须通过"n"个第一个元素).

我发现这个问题非常有用,因为当我想将我的向量存储在堆/堆栈上时,他们的答案完全解释了"内存分配器"是如何工作的:

[1] vector<Type> vect;
[2] vector<Type> *vect = new vector<Type>;
[3] vector<Type*> vect;
Run Code Online (Sandbox Code Playgroud)

然而,怀疑是困扰我一段时间,我找不到它的答案:每当我构建一个向量并开始推入大量项目时,它将达到向量将满的时刻,因此继续增长它需要重新分配,将自身复制到一个新位置,然后继续push_back项(显然,这个重新分配它隐藏在类的实现上,所以它对我来说是完全透明的)

好吧,如果我在堆上创建了向量[2],我没有想象可能发生的事情:类向量调用malloc,获取新空间然后将自身复制到新内存中,最后删除调用free的旧内存.

然而,当我在堆栈上构造一个向量时,面纱会隐藏正在发生的事情[1]:当向量必须重新分配时会发生什么?AFAIK,无论何时在C/C++上输入一个新函数,计算机都会查看变量声明,然后展开堆栈以获得放置这些变量所需的空间,但是当你在堆栈中分配更多空间时功能已在运行.类向量如何解决这个问题?

c++ stack vector allocator

12
推荐指数
3
解决办法
8856
查看次数

在64位指针中使用额外的16位

我读到64位机器实际上只使用48位地址(具体来说,我使用的是英特尔酷睿i7).

我希望额外的16位(位48-63)与地址无关,并将被忽略.但是当我尝试访问这样的地址时,我收到了一个信号EXC_BAD_ACCESS.

我的代码是:

int *p1 = &val;
int *p2 = (int *)((long)p1 | 1ll<<48);//set bit 48, which should be irrelevant
int v = *p2; //Here I receive a signal EXC_BAD_ACCESS.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?有没有办法使用这16位?

这可用于构建更多缓存友好的链表.不是将8个字节用于下一个ptr,而是将8个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.

64-bit pointers x86-64 memory-access

6
推荐指数
3
解决办法
4559
查看次数

针对索引0插入优化的C#集合?

哪些C#集合最适合零索引插入和追加到最终?

我想这很简单LinkedList,但考虑到我对大字节缓冲区的兴趣,我怀疑每个节点的内存成本可能对我的需求而言过于昂贵.

我的理解是法线List具有缓冲支持,其容量通常大于实际数据.当数据填充缓冲区时,将创建一个新缓冲区,并将旧内容传输到新缓冲区.这对于追求结束非常有用,但对于一开始的增长却是可怕的.我的测试,附加/插入一百万个随机整数到List:

  • 列出附加时间0.014秒.
  • 列出零插入时间173.343sec

c# collections

4
推荐指数
1
解决办法
254
查看次数

项目欧拉问题#11

资料来源:http://projecteuler.net/index.php?section = problem&id = 11

快速概述:采用20x20网格数字,计算水平,垂直或对角线中4对数字的最大乘积.

我目前的方法是将20x20网格划分为单行和单列,并从那里开始使用更易管理的网格.我用来将行分成行的代码是

void fillRows
    ( string::const_iterator& fieldIter, 
      list<int>& rowElements, 
      vector<list<int>>& rows )
{
    // fieldIter is already initialized.
    int count(0);
    for( ; fieldIter < field.end(); ++fieldIter )
    {
        if(isdigit(field[*fieldIter]))
        {           
            rowElements.push_back(toInt(field[*fieldIter]));
            ++count;
        }
        if(count == 40)
        {
            rows.push_back(rowElements);
            count = 0;
            rowElements.clear();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

简短说明:我将字段设置为,static const std::string field并且我正在填充带有行列表的向量.为何列出清单?因为队列没有明确的功能.也练习使用STL容器列表而不是我自己编写的容器列表.

但是,这件事不起作用.我经常看到它省略了一个字符(函数toInt将const char解析为int),最后我得到了18行,比20x20网格短两行.行的长度似乎很好.

Rows: 18

RowElements[0]: 40 (而不是对,我单独保存每个号码.稍后会修复)

我究竟做错了什么?

c++

3
推荐指数
1
解决办法
2677
查看次数