有些人不知道可以通过C中的值传递和返回结构.我的问题是关于编译器在C中返回结构时制作不必要的副本.诸如GCC之类的C编译器是使用返回值优化(RVO)优化还是仅仅是C++概念?我读过的关于RVO和copy elision的所有内容都与C++有关.
让我们考虑一个例子.我目前正在用C 实现一个双重数据类型(或者更确切地说是float-float,因为我觉得它很容易进行单元测试).请考虑以下代码.
typedef struct {
float hi;
float lo;
} doublefloat;
doublefloat quick_two_sum(float a, float b) {
float s = a + b;
float e = b - (s - a);
return (doublefloat){s, e};
}
Run Code Online (Sandbox Code Playgroud)
编译器是否会复制doublefloat
我返回的值,还是可以省略临时副本?
在C中命名的返回值优化(NRVO)怎么样?我有另一个功能
doublefloat df64_add(doublefloat a, doublefloat b) {
doublefloat s, t;
s = two_sum(a.hi, b.hi);
t = two_sum(a.lo, b.lo);
s.lo += t.hi;
s = quick_two_sum(s.hi, s.lo);
s.lo += t.lo;
s = quick_two_sum(s.hi, s.lo);
return s; …
Run Code Online (Sandbox Code Playgroud) 我在使用特定的代码时遇到了一些问题,如果有人能够就此问题启发我,我将非常感激,我已经在以下示例中将问题排除在外:
#include <iostream>
using namespace std;
class testing{
int test();
int test1(const testing& test2);
};
int testing::test(){
return 1;
}
int testing::test1(const testing& test2){
test2.test();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
那么可能导致以下错误:
test.cpp:15:错误:将'const testing'作为'int testing :: test()'的'this'参数传递,丢弃限定符
非常感谢!
在最近的Java项目中,我们需要一个基于Java的免费实时数据绘图实用程序.经过大量搜索,我们发现这个工具叫做NOAA 的Scientific Graphics Toolkit或SGT.它看起来非常强大,但我们发现它并不是非常可配置的.或者至少不能配置足以满足我们的需求.我们最终深入挖掘了Java代码并对代码进行了逆向工程并对其进行了全面更改,使得绘图工具看起来和行为方式与我们希望它的外观和行为方式相同.当然,这为NOAA未来的升级提供了机会.
那么你使用什么免费或廉价的基于Java的数据绘图工具或库?
跟进:感谢JFreeChart的建议.我查看了他们的网站,它看起来像一个非常好的数据图表和绘图工具.我应该在原来的问题中明确表示我正在专门绘制实时数据.我纠正了上面的问题,明确了这一点.尽管如此,JFreeChart对实时数据的支持似乎是微不足道的.还有其他建议吗?
是否可以在函数参数列表中使用先前的参数作为参数列表中后续参数的默认值?例如,
void f( int a, int b = a, int c = b );
Run Code Online (Sandbox Code Playgroud)
如果可以,有任何使用规则吗?
好的,所以我听到了关于这个主题的不同意见,只是想确保我理解正确.
声明void f();
和void f(void);
意思完全相同,功能f
不带任何参数.同样的定义.
声明void f(void);
意味着f
不带任何参数.
声明void f();
意味着函数f
可能有也可能没有参数,如果有,我们不知道它们是什么类型的参数,或者它们有多少参数.请注意,它与省略号不同,我们无法使用va_list
.
现在这里的事情变得有趣了.
宣言:
void f();
Run Code Online (Sandbox Code Playgroud)
定义:
void f(int a, int b, float c)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
宣言:
void f();
Run Code Online (Sandbox Code Playgroud)
定义:
void f()
{
//...
}
Run Code Online (Sandbox Code Playgroud)
当我们f
使用正确的参数,错误的参数和根本没有参数调用时,在情况1和2的编译时会发生什么?运行时会发生什么?
如果我f
用参数声明,但没有它们来定义它,它会有所作为吗?我应该能够解决函数体中的参数吗?
C++标准库提供std::equal_to
.此函数对象默认调用operator==
on类型T
.
使用有什么好处std::equal_to
?你能提供一个std::equal_to
有用的例子吗?
根据标准N4713(7.11/1)的草案:
空指针常量是一个整数文字(5.13.2),其值为零或prvalue类型
std::nullptr_t
.
和21.2.3/2:
宏
NULL
是一个实现定义的空指针常量.
以下NULL
可以定义为nullptr
.cppreference上提到了相同的内容:
#define NULL 0
//since C++11
#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)
同时"Additive operators"条款说(8.5.6/7):
如果将值
0
添加到空指针值或从空指针值中减去该值,则结果为空指针值.如果减去两个空指针值,则结果将等于0
转换为该类型的值std::ptrdiff_t
.
因此,以下代码应该是有效的:
0 + nullptr;
nullptr - nullptr;
Run Code Online (Sandbox Code Playgroud)
但由于缺乏+/-运营商对于std::nullptr_t
该代码是无效的.
有没有我没有考虑到的东西或NULL
宏不能实际定义为nullptr
?
我有一个模板 class A
template <unsigned int m>
class A
{
public:
A(int) {}
};
Run Code Online (Sandbox Code Playgroud)
哪个有构造函数int
.我有一个手术:
template<unsigned int m>
A<m> operator+(const A<m>&, const A<m>&)
{
return A<m>(0);
}
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时:
A<3> a(4);
A<3> b = a + 5;
A<3> c = 5 + a;
Run Code Online (Sandbox Code Playgroud)
我想int
隐式转换为A,但编译器会抛出错误.
有没有优雅的方法来启用隐式转换而不使用以下解决方案:
a + A<m>(5)
operator+<3>(a, 5)
我正在寻找一个免费的测试smptp服务器,它可以将电子邮件保存到我的开发测试的文件中.由于我的开发环境是Windows,我更喜欢测试电子邮件服务器在Windows上运行,但我可以考虑安装任何其他基于Linux的替代品.