我一直在为这个问题尝试不同的搜索术语,我只是在谷歌和stackoverflow上发现噪音.如果我使用C++的标准库(std)编写代码,基本上可以保证为Windows,Mac和Linux编译(并希望按预期工作)?
我想学习如何编写更好的代码,利用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
,但是把它扔到这个地方看起来就像是一个丑陋的过早优化.我正在寻找一种方法,我可以下意识地编写缓存效率的代码.
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应该工作的逻辑是编译器可以绝对看到函数签名,所以我认为你可以根据它的返回类型声明一个变量.
如果您已在编译器中启用了完全优化,并且类设置如下:
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++的新手.我发现当我玩这种语言并与语言交互时,我会更好地学习.所以我发现的一件很酷的事情就是如何让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)
在程序退出之前它将所有内存泄漏打印到输出窗口,太棒了!
我的问题是
是的,我知道我真的应该使用智能指针一样shared_ptr
,unique_ptr
等等,但我这样做是有目的的学习.这不是一个"真正的"应用程序,只是沙盒测试!
此外,这种查找内存泄漏的方式_CrtDumpMemoryLeaks ()
是否有任何无法准确发现泄漏的情况?这似乎是一个了不起的工具!
我正在尝试比较两个目录,并找到内部不同的文件.所以我使用a boost::filesystem::recursive_directory_iterator
将每个目录的所有内容添加到各自的向量中.然后我按字母顺序对每个矢量进行排序并开始比较路径 问题是它包括'基础'路径,我不希望这样,例如:
版本1 /资产/ info.txt
版本2 /资产/ info.txt
这些路径比较不同,但我希望它们进行比较.为了澄清,我甚至没有检查二进制文件,只是到目前为止的路径名称.我要像这样比较它们:
/Assets/info.txt
我已经浏览了几个小时的提升文档,我确信必须有一个优雅的解决方案来解决我的问题.我意识到我可以通过获得我想要的子串来解决这个问题,但必须有一个不那么难看的方式.
我创建了这些类型特征来确定类型是否是动态容器,但是当对向量的引用未返回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>
.那可能吗?
如果我删除模板特化部分(试图打印"测试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
c++ ×8
c++11 ×2
performance ×2
templates ×2
boost ×1
caching ×1
cpu-cache ×1
decltype ×1
filesystems ×1
inline ×1
memory-leaks ×1
pointers ×1
std ×1
type-traits ×1
wrapper ×1