小编Jon*_*han的帖子

C++:所有"std"跨平台吗?

我一直在为这个问题尝试不同的搜索术语,我只是在谷歌和stackoverflow上发现噪音.如果我使用C++的标准库(std)编写代码,基本上可以保证为Windows,Mac和Linux编译(并希望按预期工作)?

c++ cross-platform std standard-library

13
推荐指数
2
解决办法
2581
查看次数

现代处理器(如i7)是否会跟踪指针并预先获取数据,同时迭代它们的列表?

我想学习如何编写更好的代码,利用CPU的缓存.使用连续记忆似乎是理想的情况.话虽如此,我很好奇是否可以使用非连续内存进行类似的改进,但是需要遵循一系列指针,例如:

struct Position {
    int32_t x,y,z;
}
...
std::vector<Position*> posPointers;
...
updatePosition () {
    for (uint32_t i = 0; i < posPointers.size(); i++) {
        Position& nextPos = *posPointers[i];
        nextPos.x++;
        nextPos.y++;
        nextPos.z++;
    }
}
Run Code Online (Sandbox Code Playgroud)

这只是一些粗略的模拟代码,为了正确地学习这个,我们只是说所有的位置结构都是在整个堆中随机创建的.

英特尔的i7等现代智能处理器能不能直接看到它很快就会需要X_ptr数据?以下代码行会有帮助吗?

... // for loop
Position& nextPos1 = *posPointers[i];
Position& nextPos2 = *posPointers[i+1];
Position& nextPos3 = *posPointers[i+2];
Position& nextPos4 = *posPointers[i+3];
... // Work on data here
Run Code Online (Sandbox Code Playgroud)

我读过一些演示幻灯片,似乎表明这样的代码会导致处理器预取一些数据.真的吗?我知道有非标准的,特定于平台的方式来调用预取__builtin_prefetch,但是把它扔到这个地方看起来就像是一个丑陋的过早优化.我正在寻找一种方法,我可以下意识地编写缓存效率的代码.

c++ performance caching pointers cpu-cache

10
推荐指数
2
解决办法
2047
查看次数

你能在对象函数上声明一个带有decltype的成员变量吗?

struct Example
{
    boost::tokenizer<boost::char_separator<char>> tokens;
    decltype (tokens.begin()) i;
};
Run Code Online (Sandbox Code Playgroud)

在Visual Studio 2013上,我收到编译器错误C2228:'.begin'的左边必须有class/struct/union.

这是有效的C++ 11代码,如果没有,有没有办法在没有为迭代器输入长模板类型的情况下执行此操作?

我认为decltype应该工作的逻辑是编译器可以绝对看到函数签名,所以我认为你可以根据它的返回类型声明一个变量.

c++ decltype c++11

9
推荐指数
1
解决办法
1060
查看次数

C++:函数包装器是否与内联一起使用?

如果您已在编译器中启用了完全优化,并且类设置如下:

class A
{
    void Do_A_Stuff();
};
class B
{
    A a;
    void Do_B_Stuff() { a.Do_A_Stuff(); }
};
class C
{
    B b;
    void Do_C_Stuff() { b.Do_B_Stuff(); }
};
class D
{
    C c;
    void Do_D_Stuff() { c.Do_C_Stuff(); }
};
Run Code Online (Sandbox Code Playgroud)

有没有一种情况,呼叫Do_D_Stuff()会比直接呼叫慢Do_A_Stuff()?此外,这是否需要inline每个包装器'链'上的关键字,或者,因为它只是一个建议,编译器是否可以决定在没有关键字的情况下优化它?

我意识到有很多关于内联可用的信息,但是我找不到任何关于将许多包装器链接在一起的信息.

c++ performance inline wrapper

6
推荐指数
1
解决办法
1075
查看次数

在Visual Studio 2012中执行C++程序后,内存泄漏是否仍然存在?

我不是编程新手,而是C++的新手.我发现当我玩这种语言并与语言交互时,我会更好地学习.所以我发现的一件很酷的事情就是如何让Visual Studio通过以下方式提醒您程序中的任何内存泄漏:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> 
Run Code Online (Sandbox Code Playgroud)

然后打电话

_CrtDumpMemoryLeaks();
Run Code Online (Sandbox Code Playgroud)

在程序退出之前它将所有内存泄漏打印到输出窗口,太棒了!

我的问题是

  • 发现内存泄漏后,是否需要重新启动Visual Studio 2012?
  • 我需要重新启动计算机吗?
  • 这些东西多久都会泄露?或者Windows在执行结束时清理所有内存?如果这是真的,那么在Visual Studio中以"调试模式"运行程序是否仍然如此?

是的,我知道我真的应该使用智能指针一样shared_ptr,unique_ptr等等,但我这样做是有目的的学习.这不是一个"真正的"应用程序,只是沙盒测试!

此外,这种查找内存泄漏的方式_CrtDumpMemoryLeaks ()是否有任何无法准确发现泄漏的情况?这似乎是一个了不起的工具!

c++ memory-leaks visual-studio-2012

5
推荐指数
1
解决办法
1373
查看次数

C++:在比较boost :: filesystem中的路径时,如何忽略第一个目录路径?

我正在尝试比较两个目录,并找到内部不同的文件.所以我使用a boost::filesystem::recursive_directory_iterator将每个目录的所有内容添加到各自的向量中.然后我按字母顺序对每个矢量进行排序并开始比较路径 问题是它包括'基础'路径,我不希望这样,例如:

版本1 /资产/ info.txt

版本2 /资产/ info.txt

这些路径比较不同,但我希望它们进行比较.为了澄清,我甚至没有检查二进制文件,只是到目前为止的路径名称.我要像这样比较它们:

/Assets/info.txt

我已经浏览了几个小时的提升文档,我确信必须有一个优雅的解决方案来解决我的问题.我意识到我可以通过获得我想要的子串来解决这个问题,但必须有一个不那么难看的方式.

c++ filesystems boost boost-filesystem

5
推荐指数
1
解决办法
1358
查看次数

在部分特化类型特征时如何使用std :: decay?

我创建了这些类型特征来确定类型是否是动态容器,但是当对向量的引用未返回true时,最近遇到了混乱.

template<typename T>
struct is_dynamic_container
{
    static const bool value = false;
};

template<typename T , typename Alloc>
struct is_dynamic_container<std::vector<T , Alloc>>
{
    static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)

我想我需要使用std::decay,但我无法弄清楚是否可以这样做而不是在呼叫站点.

template<typename T , typename Alloc>
struct is_dynamic_container<std::decay<std::vector<T , Alloc>>::type>
{
    static const bool value = true;
};
Run Code Online (Sandbox Code Playgroud)

^^这不起作用.

我只想写能is_dynamic_container<std::vector<int>&>而不是is_dynamic_container<std::decay<std::vector<int>&>::type>.那可能吗?

c++ templates partial-specialization type-traits c++11

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

C++模板专业化:编译错误:"不是类型"

如果我删除模板特化部分(试图打印"测试2"的部分),代码编译很好,但我希望能够有一个特殊情况,运行一个看起来干净的外部用户不同的代码路径.

#include <iostream>

using namespace std;

struct SpecialType {};

template<typename A , typename B = SpecialType>
class Test
{
public:
    class TestInner
    {
    public:
        TestInner& operator* ();
    };
};

template<typename A , typename B>
typename Test<A , B>::TestInner& Test<A , B>::TestInner::operator* ()
{
    cout << "Test 1" << endl;
    return *this;
}

// If the following is removed, everything compiles/works, but I want this alternate code path:
template<typename A>
typename Test<A , SpecialType>::TestInner& Test<A , SpecialType>::TestInner::operator* ()
{
    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ templates partial-specialization specialization template-specialization

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