我知道需求的差异,我最感兴趣的是它带来的代码质量带来的好处。
我能想到的几件事:
constevalfns 在运行时从不使用(这是推测性的,我没有这方面的真实数据)注意:如果代码质量太模糊,我理解有些人可能想要结束这个问题,对我来说代码质量并不是那么模糊的术语,但是......
例如,其中constexpr故障被延迟到运行时:
constexpr int div_cx(int a, int b)
{
assert(b!=0);
return a/b;
}
int main()
{
static constexpr int result = div_cx(5,0); // compile time error, div by 0
std::cout << result;
std::cout << div_cx(5,0) ; // runtime error :(
}
Run Code Online (Sandbox Code Playgroud) 在编写一个偏移数组类时(你的idxs从100开始变为1000,所以你创建的类考虑到了这一点而不浪费数组中的前100个插槽)我遇到了一个问题.
如何初始化一个具有C数组元素的类(问题是T没有def构造函数).基本上我希望阵列完全不受限制.例:
class MyClass
{
MyClass(int i)
{
}
};
template <typename T, size_t n, size_t offset>
struct offsetedIdxArray
{
T data[n];// error line : error C2512: 'MyClass' : no appropriate default constructor available
offsetedIdxArray()
{
}
T& operator [](size_t pos)
{
return data[(pos-offset)];
}
};
Run Code Online (Sandbox Code Playgroud)
用法:
offsetedIdxArray<MyClass, 1024,offset> oia;
Run Code Online (Sandbox Code Playgroud)
使用def构造函数不是选项,因为我使用的类实际上是库类.
*编辑:* 与此处描述的问题无关,但事实证明我的宝贵的库类没有复制ctor,只需移动ctor,所以我不得不使用unique_ptr的向量.
可能重复:
访问者应该返回值还是常量引用?
首先,让我们忽略制定者和吸气者不是邪恶的.:)
我的问题是,如果我有一个std::容器作为成员的类,让我们说string,getter的返回类型应该是什么?我有点喜欢const T&相比,T性能方面的原因......我知道,大多数时候用户做一个拷贝反正,但我想不是所有的时间.我错了吗?
所以一般情况更好:
std::string get_name() const;
Run Code Online (Sandbox Code Playgroud)
要么
const std::string& get_name() const;
Run Code Online (Sandbox Code Playgroud) 这是一个基本问题,我的答案是肯定的(int = 32位,double = 53位螳螂+符号位)。
基本上可以断言?
int x = get_random_int();
double dx = x;
int x1 = (int) dx;
assert(x1 ==x);
if (INT_MAX-10>x)
{
dx+=10;
int x2=(int) dx;
assert(x+10 == x2);
}
Run Code Online (Sandbox Code Playgroud)
显然,涉及带有除法和类似内容的复杂表达式的内容((int)(5.0 / 3 * 3)与5/3 * 3是不同的),但我想知道转换和加减运算是否有效(如果没有溢出发生)保持等价。
我举了一个例子
https://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html
通过创建pthread_create没有调用的线程,使它无限运行(小睡眠,因此CPU使用不是瓶颈因此没有排队的线程)pthread_join.这会导致内存泄漏,最终PC内存不足.当我pthread_detach在创建线程程序后立即添加时,表现很好并且一段时间后内存使用量保持不变.
我的印象是当一个线程退出时(在关闭} 函数时,如果给它pthread_create),它的所有资源都被清除了.
这是一个关于decltype......的微不足道的问题我有这样的事情:
using namespace std;
template< typename BIt >
void dostuff(BIt first, BIt middle, BIt last)
{
auto temp = *first;
for_each(first, middle, [](decltype((temp)) el)
{cout << el << " "; });
}
int main()
{
std::vector<int> vi{11,22,33,44,1,2,3,4,5};
dostuff(std::begin(vi), std::begin(vi) + 4, std::end(vi));
}
Run Code Online (Sandbox Code Playgroud)
我如何避免使用临时变量(如果取消引用.begin空向量的 an 是合法的,除了丑陋的 IDK :))?
简介:我试图快速破解修复旧代码并使用__try MSVC扩展来检查某些ptr是否指向某些合法内存,或者*ptr是否会导致内存违规(如果是这样我放弃处理此ptr).所以我写了类似的东西:
bool checkIsPtrPointingToValidAddress(const void *ptr)
{
__try
{
auto cpy = *((int*)ptr); // force mem access...
if ( (cpy ==42) && ((rand()+rand()+rand()+rand()+ rand()) == 1))
{
FILE* pFile = fopen ("tempdata.dat","w"); //... by unlikely but possible action
fputs (" ",pFile);
fclose (pFile);
}
return true;
}
__except(1)
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
事实是我强制mem访问的解决方案看起来很奇怪,丑陋,作为奖励,我不确定它是否正确.另外请不要我不能禁用整个项目的优化,所以这不是一个选项.在MSDN上进行pragma优化的文档很糟糕,也就是说""是否禁用该函数的所有优化还不清楚.
我有迭代器我不想改变,但我想为该迭代器-1的值分配另一个迭代器,所以
it2 = --it1;
是不可能的.
问题:
it2 = it1-1;
不起作用.
错误:'更大 - 1'中的'operator-'不匹配c ++/4.1.1/bits/stl_bvector.h:182:注意:候选者是:ptrdiff_t std :: operator-(const std :: _ Bit_iterator_base&,const std: :_Bit_iterator_base&)
我能做到的
it2 = --it1;
it1++;
Run Code Online (Sandbox Code Playgroud)
但那太可怕了.
正如标题所说,我很好奇是否可以在正文中调用委托构造函数.
如果你对动机充满好奇:我有一些条件,只有我发现的解决方法需要在虚拟成员上写占用空间.
#include <iostream>
using namespace std;
struct Delegating {
Delegating (const string& str) {
cout <<"const string& \n";
}
Delegating(string&& str): dummy_(str.size()>4 ? 0 : (Delegating(str),0)) {
if (str.size()>4) {
cout <<"string&& \n";
}
}
bool dummy_;
};
int main() {
// your code goes here
Delegating("abc");
Delegating("abcde");
Delegating("abcde");
Delegating("abcde");
Delegating("abc");
cout << "\n--------------------\n";
Delegating(string("abc"));
Delegating(string("abcde"));
Delegating(string("abcde"));
Delegating(string("abcde"));
Delegating(string("abcde"));
Delegating(string("abc"));
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码(手动版本来自阿德勒的答案)
#include <iostream>
#include <nmmintrin.h>
#define POLY2 0x82f63b78
uint32_t crc32c2(uint32_t crc, const unsigned char *buf, size_t len)
{
int k;
crc = ~crc;
while (len--) {
crc ^= *buf++;
for (k = 0; k < 8; k++)
crc = crc & 1 ? (crc >> 1) ^ POLY2 : crc >> 1;
}
return ~crc;
}
int main(int argc, char **argv)
{
const unsigned int val = 5;
std::cout << std::hex << crc32c2(0,(const unsigned char*)&val,4) << std::endl;
std::cout …Run Code Online (Sandbox Code Playgroud)