应该避免在C/C++中使用函数的递归调用吗?
我从事机器学习/数据挖掘,因此让我的代码可扩展是非常关键的.
当我使用Java时,我尽可能避免使用递归调用,因为我经常让我的调用堆栈溢出.虽然有控制分配给调用堆栈的内存量的选项,但我认为让我的程序依赖于较少数量的参数是更理想的.因此,当很清楚如何在没有递归调用的情况下实现,可能使用自己管理的堆栈,我这样做了.但即使在Java中,我也不确定这是一门正确的学科.
据我所知,C/C++中没有调用堆栈,所以我不担心溢出它.因此,我很好奇:在程序的可伸缩性方面,是否会尝试避免使用递归,或者是鼓励它,还是特定于问题?
假设一个DLL包含以下功能
extern "C" __declspec(dllexport) void f(bool x)
{
//do something
}
extern "C" __declspec(dllexport) const char* g()
{
//do something else
}
Run Code Online (Sandbox Code Playgroud)
我在C#中使用这些函数的第一个天真的方法如下:
[DllImport("MyDll.dll")]
internal static extern void f(bool x);
[DllImport("MyDll.dll")]
internal static extern string g();
Run Code Online (Sandbox Code Playgroud)
第一个惊喜是C++ bool没有转换成C#bool(奇怪的运行时行为,但没有崩溃).所以我不得不将bool更改为byte并手动将其从一个转换为另一个.所以,第一个问题是,有没有更好的方法来编组bool(注意这是bool,而不是BOOL)
第二个惊喜是dll函数返回的原始字符串是C#字符串的OWNED,没有像我期望的那样被复制,最终C#代码释放了dll返回的内存.我找到了这个,因为程序崩溃,但后来我将返回类型更改为sbyte*并使用已经执行复制的指针手动初始化字符串.所以第二个问题是:2.1:有没有更好的方法来阻止编组的字符串拥有指针.2.2:WTF?!为什么C#会这样做?我的意思是,一个明显的例子是当dll func返回一个文字时,C#试图删除它...
在此先感谢,希望我的问题不是模糊或不可理解的.
通常如何实现STL向量?它有一个char []的原始存储,偶尔会按一定因子调整大小,然后在push_back元素时将其放置为new(我应该注意这是一种非常有趣的语法形式-语言学家应该研究诸如push_back之类的动词形式:)
然后在那里是对齐要求。因此出现一个自然的问题,我如何才能在char []上调用新的展示位置,并确保满足对齐要求。因此,我在2003年的C ++标准中搜索“ alignment”一词,发现了以下内容:
第3.9条第5款
对象类型具有对齐要求(3.9.1、3.9.2)。完整对象类型的对齐方式是一个实现定义的整数值,表示字节数。在满足其对象类型对齐要求的地址处分配对象。
第5.3.4节第10条:
一个new表达式将请求的空间量作为std :: size_t类型的第一个参数传递给分配函数。该参数应不小于所创建对象的大小;仅当对象是数组时,它才可能大于要创建的对象的大小。对于char和unsigned char数组,new-expression的结果与分配函数返回的地址之间的差应为大小不大于任何对象类型的最严格对齐要求(3.9)的整数倍。正在创建的数组的大小。[注意:由于假定分配函数将指针返回到针对任何类型的对象适当对齐的存储,这种对数组分配开销的约束允许分配字符数组的通用习惯,以后将其他类型的对象放入字符数组中。]
这两个给我上述问题提供了一个完全令人满意的答案,但是...
声明1:
X类型对象的对齐要求,其中sizeof(X)== n至少是X的地址可被n或类似的东西整除的要求(将所有与体系结构相关的事物放入“或类似那”)。
问题1:请确认,完善或拒绝上述声明1。
语句2:如果语句1是正确的,则从标准的第二个引号开始,可以得出一个5000000个字符的数组分配给可被5000000整除的地址,如果我只需要这样的字符数组而不是原始存储,则完全不需要用于放置其他物体。
问题2:那么,成功分配1000个字符的机会是否真的少于500个short(假设short为2个字节)?这实际上是一个问题吗?
我有一个最新版本的Qt Creator.
假设我们有两个范围r1 = [first1, last1)并且r2 = [first2, last2)
假设这r2是iff的一个子范围r1,存在这样的i>=0情况:
[first1 + i, first1 + i + last2 - first2)是一个有效范围
[0, last2 - first2)对于以下保持中的所有 j :
*(first1 + i + j) == *(first2 + j)
Run Code Online (Sandbox Code Playgroud)嵌套循环可以轻松确定 是否r2是 的子范围r1,甚至是一个对std::equal模板进行嵌套调用的循环。是否有更 STL 风格、更简洁的方式在 C++ 中表达相同的想法?C++0x 解决方案也受到欢迎。提前致谢。
看来,根据ISO 14882 2003(又名C的神圣的标准++)std::set<K, C, A>::erase取iterator作为参数(不是const_iterator)
从23.3.3 [2]
void erase(iterator position);
值得注意的是,在我对VS2008附带的STL的实现中,const_iterator当我尝试用另一个编译器编译我的代码时,擦除会导致令人不快的意外.现在,由于我的版本采用了a const_iterator,因此可以用a实现擦除const_iterator(就好像它不是不言而喻的).
我认为标准委员会考虑了一些实现(或者现有的实现),这需要擦除才能获得iterator.
set::erase其中需要修改将要删除的元素(我不能).编辑
我刚想到即使在迭代器的情况下你也无法修改集合中的元素.但问题仍然存在 - 为什么不是const_iterator,特别是如果它们在某种意义上是等同的
给出以下代码:
#include <iostream>
#include <string>
using namespace std;
class A
{
private:
string m_name;
string m_first;
public:
A(): m_first("string") {}
virtual void print() const {}
string& getName() const {return m_first;} // won't compile
const string& getLastName() const {return m_name;} // compile
};
int main()
{
A a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器提示:"invalid initialization of reference of type 'std::string&' from expression of type 'const std::string'"
为什么我不能从getName()返回"m_first"?我认为函数尾部的const表示该函数不会改变'this'...但我不是要改变它,只是返回一个数据成员.
首先,我想为这么长的问题道歉.你不必阅读它.您可以直接跳到问题部分,然后在需要时查找详细信息(我试图提供尽可能多的信息,因为根据我的经验,太多代码比太少更好).所以,...
我对三角形缠绕和变形有点困惑,我认为我理解.我正在尝试绘制一个定义如下的立方体:
const float a = 0.5f; //half of the cube side length
float positions[nComponents] =
{
//front face
-a, -a, -a,
a, -a, -a,
a, a, -a,
-a, -a, -a,
a, a, -a,
-a, a, -a,
//back face
-a, -a, a,
a, a, a,
a, -a, a,
-a, -a, a,
-a, a, a,
a, a, a,
//up face
-a, a, -a,
a, a, -a,
a, a, a,
-a, a, -a,
a, a, a,
-a, a, a,
//down …Run Code Online (Sandbox Code Playgroud) 在旧的已弃用的OpenGL中,我们可以这样做:
glBegin(...);
glColor3f(r_1,g_1,b_1);
glVertex3f(x_1, y_1, z_1);
glVertex3f(x_2, y_2, z_2);
...
glVertex3f(x_n, y_n, z_n);
glColor3f(r_2, g_2, b_2);
glVertex3f(x_(n+1), y_(n+1), z_(n+1));
glVertex3f(x_(n+2), y_(n+2), z_(n+2));
...
glVertex3f(x_2n, y_2n, z_2n);
...
glEnd();
Run Code Online (Sandbox Code Playgroud)
也就是说,我说每个n个连续顶点共享相同的颜色.使用新的和不推荐的OpenGL可以做同样的事吗?
例如,如果我有一个立方体,这意味着我有36个顶点.如果我希望每个面都有1种颜色,那么每个连续的6个顶点必须共享该颜色.目前我已经为每种颜色人工复制了6次颜色数据,因此顶点数组和颜色数组的大小是相同的.还有其他方法吗?希望我的问题很明确.
因此,在OpenGL学习任务中,我已经接触到基本的照明。
想象一下这个最简单的照明模型。每个顶点都有一个位置,颜色和法线。着色器将获得计算为(MV -1)T的 ModelViewProjection 矩阵(MVP),Modelview矩阵(MV)和Normal矩阵(N),以及统一的LightColor和LightDirection。顶点着色器执行光照计算-片段着色器仅输出插值的颜色。
现在,在有关该主题的每个教程中,我都发现有两件事使我感到困惑。首先,已经假定LightDirection位于眼睛坐标中。其次,输出颜色计算为
max(0, dot(LightDirection, N * normal))*LightColor*Color;
Run Code Online (Sandbox Code Playgroud)
我希望首先应该对LightDirection求逆,即我认为正确的公式是
max(0, dot(-LightDirection, N * normal))*LightColor*Color;
Run Code Online (Sandbox Code Playgroud)
似乎假设LightDirection实际上是实际光流矢量的逆向。
问题1:是否已建立某种惯例,即假设此模型中的LightDirection是无限远光源的矢量,而不是光方向的矢量,或者这不是主要问题,并且发生在我碰到的教程是如此假设吗?
Q2:如果LightDirection在世界坐标中而不是在眼睛坐标中,是否应使用法线矩阵或模型视图矩阵将其转换为眼睛坐标?
感谢您澄清这些事情!