小编NoS*_*tAl的帖子

使用 consteval 代替 constexpr 函数有什么优点?

我知道需求的差异,我最感兴趣的是它带来的代码质量带来的好处。

我能想到的几件事:

  • 读者可以只读取函数签名并知道该函数在编译时被评估
  • 编译器可能会发出更少的代码,因为constevalfns 在运行时从不使用(这是推测性的,我没有这方面的真实数据)
  • 不需要有变量来强制ctfe,最后的例子

注意:如果代码质量太模糊,我理解有些人可能想要结束这个问题,对我来说代码质量并不是那么模糊的术语,但是......

例如,其中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)

c++ constexpr c++20 consteval

3
推荐指数
1
解决办法
217
查看次数

阻止调用类中的数组的默认构造函数

在编写一个偏移数组类时(你的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的向量.

c++ arrays initialization

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

一般来说,STL容器的getter返回类型应该是什么?

可能重复:
访问者应该返回值还是常量引用?

首先,让我们忽略制定者和吸气者不是邪恶的.:)

我的问题是,如果我有一个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)

c++ getter-setter

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

是否可以将所有32位整数精确地表示为双精度?

可能重复:
IEEE 754浮点数不能准确表示的第一个整数是什么?

这是一个基本问题,我的答案是肯定的(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是不同的),但我想知道转换和加减运算是否有效(如果没有溢出发生)保持等价。

double ieee-754

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

为什么在pthread_create之后未分离线程时,未连接的pthread会泄漏资源

我举了一个例子

https://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

通过创建pthread_create没有调用的线程,使它无限运行(小睡眠,因此CPU使用不是瓶颈因此没有排队的线程)pthread_join.这会导致内存泄漏,最终PC内存不足.当我pthread_detach在创建线程程序后立即添加时,表现很好并且一段时间后内存使用量保持不变.

我的印象是当一个线程退出时(在关闭} 函数时,如果给它pthread_create),它的所有资源都被清除了.

c memory-leaks pthreads

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

如何从迭代器获取迭代器底层类型?

这是一个关于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 :))?

c++ templates iterator decltype c++11

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

如何防止编译器优化对从未使用过的变量的加载

简介:我试图快速破解修复旧代码并使用__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优化的文档很糟糕,也就是说""是否禁用该函数的所有优化还不清楚.

c++ seh dead-code compiler-optimization visual-c++

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

如何从双向迭代器中减去1

我有迭代器我不想改变,但我想为该迭代器-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)

但那太可怕了.

c++ stl

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

C++中的委托构造函数可以在正文中调用还是只在初始化列表中调用?

正如标题所说,我很好奇是否可以在正文中调用委托构造函数.

如果你对动机充满好奇:我有一些条件,只有我发现的解决方法需要在虚拟成员上写占用空间.

#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)

c++ c++11

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

_mm_crc32 给出与手动版本不同的结果

我有以下代码(手动版本来自阿德勒的答案

 #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)

c++ sse crc intrinsics

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