当一个函数采用shared_ptr(来自boost或C++ 11 STL)时,你传递它:
通过const引用: void foo(const shared_ptr<T>& p)
或按价值:void foo(shared_ptr<T> p)?
我更喜欢第一种方法,因为我怀疑它会更快.但这真的值得吗还是还有其他问题吗?
您能否说出您选择的原因或案例,为什么您认为无关紧要.
我想一起计算一个值的正弦和正弦值(例如创建一个旋转矩阵).当然我可以一个接一个地分别计算它们a = cos(x); b = sin(x);,但我想知道在需要两个值时是否有更快的方法.
编辑: 总结到目前为止的答案:
我想将一个值钳位x到一个范围[a, b]:
x = (x < a) ? a : ((x > b) ? b : x);
Run Code Online (Sandbox Code Playgroud)
这是非常基本的.但是我没有在类库中看到函数"clamp" - 至少在类库中没有System.Math.
(因为不知道"钳制"一个值是为了确保它位于某些最大值和最小值之间.如果它大于最大值,则它被最大值替换,等等.)
使用Eclipse和CDT来调试C++代码,变量窗口很麻烦,对于标准模板库或boost中定义的类型(例如shared_ptr)而言,信息量不大.
只是一个例子,这对于std :: vector来说可能是这样的:
bar {...}
std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >
_M_impl {...}
std::allocator<TSample<MyTraits> > {...}
_M_start 0x00007ffff7fb5010
_M_finish 0x00007ffff7fd4410
_M_end_of_storage 0x00007ffff7fd5010
Run Code Online (Sandbox Code Playgroud)
即使关于这些类型的内部结构的这些信息可能有用,但在几乎任何情况下我都期望在这里有更清晰的表示,即std :: vector的值列表.是否有任何工具,插件或其他修改可以做到这一点?
编辑
以下解决方案不适用于Linux.我正在使用ubuntu 14.04,eclipse,g ++,gdb.
我找不到包gdb-python和linux不使用mingw
这个问题可能有些奇怪,但我怎样才能加快g ++编译时间?我的C++代码大量使用boost和模板.我已经尽可能多地从头文件中移动并使用-j选项,但是编译(和链接)仍需要很长时间.
是否有任何工具可以分析我的代码并指出编译器的瓶颈?或者可以以某种方式分析在我的代码上运行的编译器?这将是非常好的,因为有时我有这样的印象,我花了太多时间盯着编译器控制台日志...
我有两个枚举:IEnumerable<A> list1和IEnumerable<B> list2.我想同时迭代它们,如:
foreach((a, b) in (list1, list2))
{
// use a and b
}
Run Code Online (Sandbox Code Playgroud)
如果它们不包含相同数量的元素,则应抛出异常.
做这个的最好方式是什么?
我有一个class A { public float Score; ... }和一个,IEnumerable<A> items并希望找到A最低分.
使用items.Min(x => x.Score)给出最小分数而不是具有最小分数的实例.
如何只通过迭代一次数据来获取实例?
编辑:这么长时间有三个主要解决方案:
编写扩展方法(由Svish提出).优点:易于使用和评估每个项目只有一次得分.缺点:需要扩展方法.(我为我的申请选择了这个解决方案.)
使用Aggregate(由Daniel Renshaw提出).优点:使用内置的LINQ方法.缺点:对未经训练的眼睛略微混淆并且不止一次地给评估者打电话.
实施IC Comparable(由网络化提出).优点:可以直接使用Linq.Min.缺点:固定为一个比较器 - 在执行最小计算时无法自由选择比较器.
考虑以下模板类
class MyClassInterface {
public:
virtual double foo(double) = 0;
}
class MyClass<int P1, int P2, int P3>
: public MyClassInterface {
public:
double foo(double a) {
// complex computation dependent on P1, P2, P3
}
// more methods and fields (dependent on P1, P2, P3)
}
Run Code Online (Sandbox Code Playgroud)
模板参数P1,P2,P3是在限制范围就像从0一些固定值n固定在编译时.
现在我想建立一个像"工厂"的方法
MyClassInterface* Factor(int p1, int p2, int p3) {
return new MyClass<p1,p2,p3>(); // <- how to do this?
}
Run Code Online (Sandbox Code Playgroud)
问题是如何在模板参数仅在运行时知道时如何实现模板类的构造.对于具有非常大的域(如双)的模板参数,同样可能吗?如果可能的解决方案可扩展到使用更多模板参数,请另请考虑.
因此,当使用GCC编译大量源文件时,可以使用-j来使用所有可用内核.但链接器怎么样?是否有类似的选项来加速链接或GCC不支持多线程?在一些较大的项目中,它可能需要一段时间......(......我讨厌等待!)
编辑:感谢您指出-j是make的选项,而不是gcc/g ++.但这不能回答我的问题!我想知道gcc是否可以在链接程序时使用多线程!
"无限"IEnumerable的一个简单例子
IEnumerable<int> Numbers() {
int i=0;
while(true) {
yield return unchecked(i++);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道
foreach(int i in Numbers().Take(10)) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
和
var q = Numbers();
foreach(int i in q.Take(10)) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
两者都工作正常(并打印数字0-9).
但复制或处理表达式时是否有任何陷阱q?我可以依赖这样一个事实,即它们总是被评估为"懒惰"吗?产生无限循环有危险吗?
c# ×5
c++ ×5
templates ×2
algorithm ×1
boost ×1
c ×1
c++11 ×1
clamp ×1
compilation ×1
eclipse ×1
eclipse-cdt ×1
enumeration ×1
g++ ×1
gcc ×1
gdb ×1
ienumerable ×1
iteration ×1
linker ×1
linq ×1
math ×1
shared-ptr ×1
yield-return ×1