小编Ben*_*igt的帖子

使用带有多个变量的语句

通过以某种方式在同一个使用块中声明2变量,是否可以使这个代码更紧凑?

using (var sr = new StringReader(content))
{
    using (var xtr = new XmlTextReader(sr))
    {
        obj = XmlSerializer.Deserialize(xtr) as TModel;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# using-statement

303
推荐指数
2
解决办法
9万
查看次数

从版本4.1开始,OpenGL中的文本渲染技术是什么?

关于OpenGL中的文本呈现已经有很多问题,例如:

但主要讨论的是使用固定功能管道渲染纹理四边形.当然着色器必须做出更好的方法.

我并不真正关心国际化,我的大部分字符串都是情节刻度标签(日期和时间或纯数字).但是这些图将以屏幕刷新率重新渲染,并且可能会有相当多的文本(屏幕上不超过几千个字形,但足够硬件加速布局会很好).

使用现代OpenGL进行文本渲染的推荐方法是什么?(引用现有软件使用该方法是很好的证据,它运作良好)

  • 接受例如位置和方向以及字符序列并发出纹理四边形的几何着色器
  • 渲染矢量字体的几何着色器
  • 如上所述,但改为使用曲面细分着色器
  • 用于进行字体光栅化的计算着色器

opengl shader text glsl opengl-4

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

C++标准是否要求iostream的性能不佳,或者我只是处理糟糕的实现?

每当我提到C++标准库iostream的慢性能时,我都会遇到一阵难以置信的风潮.然而,我有剖析器结果显示在iostream库代码中花费了大量时间(完全编译器优化),并且从iostream切换到特定于操作系统的I/O API和自定义缓冲区管理确实提供了一个数量级的改进.

C++标准库做了多少额外工作,标准是否需要它,它在实践中是否有用?或者有些编译器提供了与手动缓冲区管理竞争的iostream实现吗?

基准

为了解决问题,我编写了几个简短的程序来练习iostreams内部缓冲:

请注意,ostringstreamstringbuf版本运行的迭代次数较少,因为它们的速度要慢得多.

在ideone上,它ostringstreamstd:copy+ back_inserter+ 慢大约3倍std::vector,比memcpy原始缓冲区慢大约15倍.当我将实际应用程序切换到自定义缓冲时,这与前后分析一致.

这些都是内存缓冲区,因此iostream的缓慢不能归咎于缓慢的磁盘I/O,过多的刷新,与stdio的同步,或者人们用来解释C++标准库观察到的缓慢的任何其他事情iostream的.

很高兴看到其他系统上的基准测试和常见实现的评论(例如gcc的libc ++,Visual C++,Intel C++)以及标准规定了多少开销.

此测试的基本原理

许多人都正确地指出,iostream更常用于格式化输出.但是,它们也是C++标准提供的二进制文件访问的唯一现代API.但是对内部缓冲进行性能测试的真正原因适用于典型的格式化I/O:如果iostreams无法保持磁盘控制器提供原始数据,那么当他们负责格式化时,他们怎么可能跟上呢?

基准时间

所有这些都是outer(k)循环的每次迭代.

在ideone上(gcc-4.3.4,未知的操作系统和硬件):

  • ostringstream:53毫秒
  • stringbuf:27毫秒
  • vector<char>并且back_inserter:17.6毫秒
  • vector<char> 与普通迭代器:10.6毫秒
  • vector<char> 迭代器和边界检查:11.4 ms
  • char[]:3.7毫秒

在我的笔记本电脑上(Visual C++ 2010 x86,cl …

c++ performance iostream

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

我对值初始化的尝试被解释为函数声明,为什么不是A a(()); 解决这个问题?

Stack Overflow教给我的很多东西都是所谓的"最令人烦恼的解析",经典地用一条线来证明

A a(B()); //declares a function
Run Code Online (Sandbox Code Playgroud)

虽然这对于大多数人而言,直观地看起来是a类型对象的声明A,将临时B对象作为构造函数参数,它实际上是一个函数a返回的声明A,将一个指针指向一个返回的函数,它B本身不带参数.同样的线

A a(); //declares a function
Run Code Online (Sandbox Code Playgroud)

也属于同一类别,因为它代替一个对象,它声明了一个函数.现在,在第一种情况下,这个问题的通常解决方法是在其周围添加一组额外的括号/括号B(),因为编译器会将其解释为对象的声明

A a((B())); //declares an object
Run Code Online (Sandbox Code Playgroud)

但是,在第二种情况下,执行相同操作会导致编译错误

A a(()); //compile error
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么?是的我非常清楚正确的"解决方法"是将其更改为A a;,但我很想知道()第一个示例中的额外功能是什么,然后在重新应用它时不起作用第二个例子.A a((B()));变通办法是否是写入标准的特定异常?

c++

154
推荐指数
5
解决办法
2万
查看次数

C++性能挑战:整数到std :: string的转换

任何人都可以击败我的整数到std :: string代码的性能,链接如下?

已经有几个问题可以解释如何将整数转换为std::stringC++中的整数,例如这个,但是所提供的解决方案都没有效率.

以下是一些可用于竞争的常用方法的编译就绪代码:

流行的看法相反,boost::lexical_cast有自己的实现(白皮书)并且不使用stringstream和数字插入运算符.我真的希望看到它的性能比较,因为另一个问题表明它很悲惨.

我自己的贡献,在桌面计算机上具有竞争力,并演示了一种在嵌入式系统上全速运行的方法,与依赖整数模数的算法不同:

如果您想使用该代码,我将根据简化的BSD许可证提供(允许商业使用,需要归属).请问.

最后,该功能ltoa是非标准的,但可广泛使用.

  • ltoa版本,适用于拥有提供它的编译器的任何人(ideone没有):http://ideone.com/T5Wim

我很快就会发布我的性能测量结果.

算法规则

  • 提供将至少32位有符号和无符号整数转换为十进制的代码.
  • 产生输出作为std::string.
  • 没有与线程和信号不兼容的技巧(例如,静态缓冲区).
  • 您可以假设ASCII字符集.
  • 确保INT_MIN在绝对值无法表示的二进制补码机上测试代码.
  • 理想情况下,输出应为字符的字符与规范的C++版本使用相同的stringstream,http://ideone.com/jh3Sa,但任何事情,这显然是理解的,因为正确的号码也是OK.
  • :虽然你可以使用你想要进行比较的任何编译器和优化器选项(除了完全禁用),但代码还需要编译并在至少VC++ 2010和g ++下给出正确的结果.

希望讨论

除了更好的算法,我还想在几个不同的平台和编译器上获得一些基准测试(让我们使用MB/s吞吐量作为我们的标准测量单位).我相信我的算法代码(我知道sprintf基准测试需要一些快捷方式 - 现在已经修复)是标准的明确定义的行为,至少在ASCII假设下,但是如果你看到任何未定义的行为或输出的输出无效,请指出.

结论:

不同的算法对g ++和VC2010执行,可能是由于std::string每个算法的实现不同.VC2010显然在NRVO方面做得更好,摆脱了价值回报只对gcc有帮助.

发现代码的性能优于sprintf一个数量级. ostringstream落后50倍甚至更多.

挑战的胜利者是user434507,他在gcc上生成的代码运行速度是我自己的350%.由于SO社区的突发奇想,其他条目将被关闭.

目前(最终?)速度冠军是:

  • 对于gcc:user434507,速度比sprintf …

c++ string performance integer

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

std :: array的默认初始化?

使用C++ 11 std::array,我是否可以保证语法std::array<T, N> x;将默认初始化数组的所有元素?

编辑:如果没有,是否有一个语法可以在所有数组(包括零大小的数组)上工作,以将所有元素初始化为默认值?

编辑:在cppreference上,默认的构造函数描述说:

(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array 
Run Code Online (Sandbox Code Playgroud)

所以答案可能是肯定的.但我想根据标准或未来标准确定这一点.

initialization default-constructor c++11 stdarray

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

size_t和unsigned int之间的区别?

我很困惑size_t.我在互联网上搜索过并且提到的size_t是无符号类型,因此它可以表示非负值.

我的第一个问题是,如果它用于表示非负值,为什么我们不使用 unsigned int而不是size_t

我的第二个问题是:是size_tunsigned int可互换的?如果不是那么为什么?

谁能给我一个很好的例子size_t和简短的工作?

c unsigned types

86
推荐指数
5
解决办法
6万
查看次数

构建REST API的在线文档

我正在构建我的第一个Rest API,它将数据序列化为JSON和XML格式.我想为API客户端提供一个索引页面,他们可以在这里选择已实现的端点.

我需要提供哪些信息才能使我的API最有用,我该如何组织它?

api indexing rest

85
推荐指数
1
解决办法
26万
查看次数

为什么(以及何时)我需要在sizeof之后使用括号?

以下无法编译:

typedef int arr[10];
int main(void) {
    return sizeof arr;
}

sizeof.c:3: error: expected expression before ‘arr’
Run Code Online (Sandbox Code Playgroud)

但如果我改成它

sizeof(arr);
Run Code Online (Sandbox Code Playgroud)

一切都好.为什么?

c sizeof

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

迭代向量,删除某些项目

我有一个std :: vector m_vPaths; 我会迭代这个向量并调用:: DeleteFile(strPath).如果我成功删除了该文件,我将从矢量中删除它.我的问题是,我可以使用两个向量吗?是否有不同的数据结构可能更适合我需要做的事情?

示例:使用迭代器几乎可以实现我想要的,但问题是一旦使用迭代器擦除,所有迭代器都将变为无效.

 std::vector<std::string> iter = m_vPaths.begin();
    for( ; iter != m_vPaths.end(); iter++) {
        std::string strPath = *iter;
        if(::DeleteFile(strPath.c_str())) {
            m_vPaths.erase(iter);   
                //Now my interators are invalid because I used erase,
                //but I want to continue deleteing the files remaining in my vector.    
        }
    }
Run Code Online (Sandbox Code Playgroud)

我可以使用两个向量,我将不再有问题,但是有没有更好,更有效的方法来做我想做的事情?

顺便说一句,如果不清楚,m_vPaths就是这样声明的(在我的课上):

std::vector<std::string> m_vPaths;
Run Code Online (Sandbox Code Playgroud)

c++ iterator loops vector data-structures

62
推荐指数
3
解决办法
6万
查看次数