标签: c++

得到的安全替代方案

我想从标准输入中读取整行,包括两个单词之间的空格.

当使用get on gcc时,我收到以下消息:

send.c:(.text+0x2a): warning: the `gets' function is dangerous and should not be used.
Run Code Online (Sandbox Code Playgroud)

什么是更好的选择?

c c++ gets fgets

25
推荐指数
0
解决办法
2万
查看次数

删除不完整类型的对象

这个让我想到:

class X;

void foo(X* p)
{
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

delete p如果我们甚至不知道是否X有可见的析构函数,我们怎么可能呢?g ++ 4.5.1给出了三个警告:

warning: possible problem detected in invocation of delete operator:
warning: 'p' has incomplete type
warning: forward declaration of 'struct X'
Run Code Online (Sandbox Code Playgroud)

然后它说:

注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete.

哇......像g ++一样诊断这种情况需要编译器吗?还是未定义的行为?

c++ pointers forward-declaration delete-operator incomplete-type

25
推荐指数
2
解决办法
1万
查看次数

为什么c ++程序员使用!=而不是<

在c ++引言中,第95页作者说c ++程序员倾向于使用!=而不是<在编写循环时.

for (vector<int>::size_type i = 0; i != 10; ++i) is preferred instead of 
for (vector<int>::size_type i = 0; i < 10; ++i) 
Run Code Online (Sandbox Code Playgroud)

我在加速c ++中读了同样的东西.有人可以解释这背后的基本原理

c++

25
推荐指数
6
解决办法
2041
查看次数

在C++中,我应该几乎总是使用虚拟继承吗?

我从这个条目中看到虚拟继承将sizeof(指针)添加到对象的内存占用.除此之外,默认情况下使用虚拟继承是否有任何缺点,只有在需要时才使用常规继承?这似乎会带来更具前瞻性的课堂设计,但也许我错过了一些陷阱.

c++ multiple-inheritance virtual-inheritance

25
推荐指数
2
解决办法
5485
查看次数

C++队列 - 简单的例子

我找不到简单的例子如何在C++中使用队列来指向某些myclass对象.我有这样的代码:

class myclass{
  string s;
};

myclass *p = new myclass();

my_queue.push(p);

//something....

p = my_queue.front();
my_queue.pop();

std::cout << p->s;
Run Code Online (Sandbox Code Playgroud)

什么应该声明my_queue?我应该使用队列还是其他数据结构?

我需要c ++只是为了小程序,谢谢你的答案.

c++ queue

25
推荐指数
3
解决办法
10万
查看次数

*(指针+索引)和指针[]之间的区别

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];
Run Code Online (Sandbox Code Playgroud)

有没有之间的功能差异*(myPointer + index)myPointer[index]?这被认为是更好的做法?

c++ pointers

25
推荐指数
4
解决办法
5万
查看次数

松耦合隐式转换

类型在语义上等效时,隐式转换非常有用.例如,假设两个库以相同的方式实现类型,但在不同的命名空间中.或者只是一种大多数相同的类型,除了一些语义糖在这里和那里.现在,您无法将一种类型传递给设计为使用另一种的函数(在其中一个库中),除非该函数是模板.如果不是,你必须以某种方式将一种类型转换为另一种类型.这应该是微不足道的(或者其他类型在后面都不是那么相同!)但是调用转换显然会使代码膨胀,而且函数调用几乎毫无意义.虽然这样的转换函数实际上可能会复制一些值,但它们从高级"程序员"的角度来看基本上什么都不做.

隐式转换构造函数和运算符显然可以提供帮助,但它们引入了耦合,因此其中一种类型必须知道另一种类型.通常,至少在处理库时,情况并非如此,因为其中一种类型的存在使另一种类型变得冗余.此外,您不能总是更改库.

现在我看到有关如何在用户代码中进行隐式转换的两个选项:

  1. 第一个是提供代理类型,它为所有涉及的类型实现转换操作符和转换构造函数(和赋值),并始终使用它.

  2. 第二个需要对库进行最小的更改,但允许很大的灵活性:为每个可以在外部选择启用的相关类型添加转换构造函数.

例如,对于类型A添加构造函数:

template <class T> A(
  const T& src,
  typename boost::enable_if<conversion_enabled<T,A>>::type* ignore=0
)
{
  *this = convert(src);
}
Run Code Online (Sandbox Code Playgroud)

和一个模板

template <class X, class Y>
struct conversion_enabled : public boost::mpl::false_ {};
Run Code Online (Sandbox Code Playgroud)

默认情况下禁用隐式转换.

然后要启用两种类型之间的转换,请专门化模板:

template <> struct conversion_enabled<OtherA, A> : public boost::mpl::true_ {};
Run Code Online (Sandbox Code Playgroud)

并实现一个convert可以通过ADL找到的函数.

我个人更喜欢使用第二种变体,除非有强烈的反对意见.

现在回答实际问题:关联隐式转换类型的首选方法是什么?我的建议是好主意吗?两种方法都有任何缺点吗?允许这样的转换是危险的吗?如果库类实现者通常会提供第二种方法,那么它们的类型很可能会被软件复制,而这些软件很可能与它们一起使用(我在考虑使用3d渲染中间件,其中大多数软件包实现了3D向量).

c++ boost-mpl enable-if

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

使用或切换语句

我正在创建一个控制台应用程序并使用switch语句来创建一个简单的菜单系统.用户输入采用单个字符的形式,在屏幕上显示为大写字母.但是,我确实希望程序接受小写和大写字符.

我理解switch语句用于比较常量,但有可能做类似下面的事情吗?

switch(menuChoice) {
    case ('q' || 'Q'):
        //Some code
        break;
    case ('s' || 'S'):
        //More code
        break;
    default:
        break;
}
Run Code Online (Sandbox Code Playgroud)

如果无法做到这一点,是否有解决方法?我真的不想重复代码.

c++ switch-statement conditional-statements or-operator

25
推荐指数
2
解决办法
3万
查看次数

OpenMP:Visual C++ 2008和2010之间的巨大性能差异

我正在运行一个摄像头采集程序,对采集的图像进行处理,我正在使用简单的OpenMP指令进行处理.所以基本上我等待来自相机的图像,然后处理它.

迁移到VC2010时,我看到了非常奇怪的性能问题:在VC2010下,我的应用程序占用了近100%的CPU,而在VC2008下只占用了10%.

如果我只对处理代码进行基准测试,那么VC2010和VC2008之间没有区别,使用采集功能会产生差异.

我已经将重现问题所需的代码减少到一个简单的循环,执行以下操作:

  for (int i=0; i<1000; ++i)
  {
    GetImage(buffer);//wait for image
    Copy2Array(buffer, my_array);

    long long sum = 0;//do some simple OpenMP parallel loop
    #pragma omp parallel for reduction(+:sum)
    for (int j=0; j<size; ++j)
      sum += my_array[j];
  }
Run Code Online (Sandbox Code Playgroud)

这个循环占2008年CPU的5%,2010年占70%.

我做了一些分析,这表明在2010年大部分时间花在了OpenMP上 vcomp100.dll!_vcomp::PartialBarrierN::Block

我还做了一些并发性分析:

在2008年,处理工作分布在3个工作线程上,由于处理时间远远低于图像等待时间,所以它们非常活跃

相同的线程出现在2010年,但它们都被该PartialBarrierN::Block功能100%占用.由于我有四个核心,他们正在吃75%的工作,这大致是我在CPU职业中看到的.

所以看起来OpenMP和Matrox采集库(专有)之间存在冲突.但它是VS2010或Matrox的错误吗?有什么我能做的吗?使用VC++ 2010对我来说是必须的,所以我不能坚持使用2008.

十分感谢

状态更新

正如DeadMG所建议的那样,使用新的并发框架会导致40%的CPU.分析它显示时间花在处理上,因此它没有显示我在OpenMP中看到的错误,但在我的情况下性能比OpenMP差.

状态更新2

我已经安装了最新英特尔C++的评估版.它显示完全相同的性能问题!!

我交叉发布到MSDN论坛

状态更新3

在Windows 7 64位和XP 32位上测试,结果完全相同(在相同的机器上)

c++ performance openmp visual-studio-2010

25
推荐指数
2
解决办法
8726
查看次数

如何在C++容器中存储不同类型的对象?

是否有一个我可以使用或构建的C++容器,可以包含,比如intstringdouble类型?我面临的问题是每当我尝试填充地图,矢量或列表时,例如,以下内容:

int x;
string y;
double z;
Run Code Online (Sandbox Code Playgroud)

我受限于以下格式:

list<int> mycountainer;
vector<string> mycontainer;
Run Code Online (Sandbox Code Playgroud)

哪种力量mycontainer只包含一种类型.

在任何人提出泛型之前,由于C++附带的标准vectorlist容器已经是通用的,因此它们无法工作 - 它们可以是任何类型的容器,但不能包含多种类型.

如果可能的话,我也想避免使用Boost - 我更喜欢它,如果有一种简单的方法我可以自己编码.

[编辑]嘿伙计,非常感谢你的建议 - 我应该解释我将如何使用这个容器,但它有点复杂,因此上面的(大)简化.我认为这里最好的选择是使用Boost.再次感谢.

c++ polymorphism containers types

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