相关疑难解决方法(0)

C++构造替换C构造

在与我的团队中新来的开发人员讨论之后,我意识到在C++中仍然存在使用C构造的习惯,因为它们应该更好(即更快,更精简,更漂亮,选择你的理由).

与类似的C++构造相比,有哪些示例值得共享,显示C构造?

对于每个示例,我需要阅读C++构造与原始C构造一样好或甚至更好的原因.目的是提供一些在C++代码中被认为有些危险/不安全的C构造的替代方案(C++ 0x只有在只有明确标记为C++ 0x的情况下才能接受答案).

我将在答案(结构内联初始化)下面作为示例发布.

注1:请每个案例一个答案.如果您有多个案例,请发布多个答案

注2:这不是C问题.不要在此问题中添加"C"标签. 这不应该成为C++和C之间的斗争.只研究C++的C子集的一些结构,以及它们在其他C++"工具包"中的替代方案.

注3:这不是一个抨击C的问题.我想要理由.吹嘘,抨击和未经证实的比较将被下调.提及没有C等价物的C++特性可以被认为是不可能的主题:我希望并排放置一个针对C++特性的C特征.

c c++ language-construct

17
推荐指数
9
解决办法
3177
查看次数

如何在C++中将数组的一部分复制到另一个数组?

这与C#中提出的问题相同,但我需要C++

如何将数组的一部分复制到另一个数组?

考虑一下我

    int[] a = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

现在,如果我给出数组的起始索引和结束索引,它应该被复制到另一个数组.

就像我将start index作为1并将end index作为3一样,元素2,3,4应该被复制到新数组中.

在C#中,它完成如下

     int[] b = new int[3];
    Array.Copy(a, 1, b, 0, 3);
Run Code Online (Sandbox Code Playgroud)

有没有像这样的简单方法在C++中执行相同的任务?

c++

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

在c ++中复制和操作大型,密集的2D数组的最快方法是什么

我正在尝试优化我的代码,利用多核处理器来复制任何操作大型密集阵列.

对于复制:我有一个大密集阵列(大约6000x100000),我需要从中拉出15x100000子阵列,在管道上进行多次计算.该管道由许多线性代数函数组成,这些函数由blas处理,这是多核的.与线性代数相比,提取数据的时间是否真的重要是一个悬而未决的问题,但我要谨慎一点,并确保数据复制得到优化.

对于操作:我有许多不同的函数,通过元素或行来操作数组.如果每个都做多核,那将是最好的.

我的问题是:最好是使用正确的框架(OpenML,OpenCL)并让编译器发生所有的魔术,还是有更好的功能/库可以更快地完成这项工作?

c++ arrays parallel-processing performance opencl

10
推荐指数
1
解决办法
926
查看次数

std :: copy vs memcpy的效率

使用memcpystd::copy?之间的效率损失有多严重?

我有一种情况,我的系统上的矢量实现似乎没有使用连续的内存,这使得我必须稍后std ::复制其内容而不是做memcpy(dest, &vec[0], size);.我不确定这可能会对效率造成多大影响.

c++ performance stl

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

C++标准库的(其余部分)未涵盖C标准库的哪些部分?

C++库包含与C语言库相同的定义

但是C++库似乎在非C库头中复制(/扩展)C库的一些功能.例如,C库有<string.h>,C++库有<cstring>和<string>; C库有<time.h>,C +库有<ctime>和<chrono>.

如果我需要一个字符串类,我假设我最好使用<string>而不是<cstring>,因为<string>可以受益于C++中的所有非C功能(例如异常).但是C库中的功能在C++库中不存在于任何其他形式.例如,我在<cstring>之外找不到像memcpy和memcmp这样的东西.

C库的哪些部分在非C库头中没有模拟?

(如果C++标准的版本对此很重要,我对C++ 11很感兴趣.)

c++ c++-standard-library c++11

6
推荐指数
1
解决办法
291
查看次数

是否有一种可移植的方式来复制C#中的内存块?

如果你想在两个数组之间进行内存复制,那么Array.Copy在.NET中有一个函数:

char[] GetCopy(char[] buf)
{
    char[] result = new char[buf.Length];
    Array.Copy(buf, result);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这通常是比手动换循环的所有字符复制更快bufresult,因为它是一个块拷贝操作,仅仅需要一块内存,并将其写入到目标.

同样,如果我给了a char*int指定了它的大小,我的选择是什么?这是我考虑过的:

  • Buffer.BlockCopy:需要srcdst成为数组
  • Buffer.MemoryCopy:正是我正在寻找的,但仅在.NET桌面上可用
  • Marshal.Copy:在.NET 2.0中停止受支持

或者,如果没有其他选择,是否有某种方法从指针char*和长度构造数组int?如果我能做到这一点,我可以将指针转换为数组并将它们传递给Array.Copy.

我不是在寻找for循环,因为正如我所说的那样,与块副本相比它们效率不高,但如果这是我认为必须做的唯一方法.

TL; DR:我基本上都在寻找memcpy(),但在C#中可以用于PCL.

c# arrays pointers copy memcpy

6
推荐指数
1
解决办法
1011
查看次数

为什么不将std :: count和std :: find优化为使用memchr?

我读sehe的回答这个问题,并惊讶地看到使用使用手写环发现sehe std::memchr快3倍还比使用std::count(见注释).使用的代码std::count可以在编辑2中看到,但它基本上归结为:

const auto num_lines = std::count(f, l, '\n');
Run Code Online (Sandbox Code Playgroud)

VS

uintmax_t num_lines = 0;
while (f && f != l)
    if ((f = static_cast<const char*>(memchr(f, '\n', l - f))))
        num_lines++, f++;
Run Code Online (Sandbox Code Playgroud)

我原本期望std::count版本至少和那个版本一样快std::memchr- 出于类似的原因,为什么使用它std::copy应该至少和它一样快std::memcpy.

我检查了我的标准库(libc ++)的实现std::count,并没有尝试优化char输入类型(同上std::find).

为什么是这样?std::memchr如果提供char*迭代器和char值,实现是否可以不调度?

c++ performance c++-standard-library

6
推荐指数
1
解决办法
350
查看次数

memcpy函数在C++中与Java等价

我有C++

memcpy (&wkpm, (PMSK *)pr_masks + (long)(x - 1), sizeof(PMSK)); 
Run Code Online (Sandbox Code Playgroud)

哪里PMSK是结构.它将是Java中的一个类.

现在假设我在这里将整个内存块复制到pr_masks中,即创建PMSK该类的其他实例.如何在Java中执行此操作.

示例:在第20行的java代码中,我希望捕获类实例,然后再次使用第100行中的相同实例.在两者之间可能有许多修改.

希望我对我的问题很清楚.

谢谢

c++ java

5
推荐指数
1
解决办法
4275
查看次数

将矢量分成几个的最有效方法

我有以下代码将vectorOfInterest拆分为较小的块以发送出去.这段代码正在运行.

但是,当我将vectorOfInterest拆分为较小的块(在subList和其余的构造函数中)时,我会复制一份.是否有更好的使用移动而不是再次复制数据以获得更好的性能?

请注意,我无法更改OTHERCLASS :: doSend()的参数

编辑:我正在使用C++ 98

int blockSize = 50;
vector <CLASS_T> vectorOfInterest; 

// ...<populates vectorOfInterest>
do {
    if(vectorOfInterest.size()> blockSize)
        vector<CLASS_T>iterator from = vectorOfInterest.begin();
        vector<CLASS_T>iterator to = from + blockSize;

        //elements are copied again in subList and remainder
        //I like to move the elements from vectorOfInterest instead.
        vector<CLASS_T> subList (from, to);  
        vector<CLASS_T> remainder (to, vectorOfInterest.end());
        vectorOfInterest.swap(remainder);

        OTHERCLASS::doSend (subList); // method which sends sublists in blocks of exactly 50 to external library
    }else {
        //pad to exactly size 50 
        vectorOfInterest.resize(blockSize); …
Run Code Online (Sandbox Code Playgroud)

c++ vector c++98

5
推荐指数
1
解决办法
4028
查看次数

用C++解析二进制消息.任何包含示例的lib?

我正在寻找在C++中解析二进制消息的任何示例库.大多数人要求读取二进制文件或在套接字中接收的数据,但我只需要解码一组二进制消息.有人提到了boost :: spirit,但我找不到合适的例子来满足我的需求.

例如:9A690C12E077033811FFDFFEF07F042C1CE0B704381​​E00B1FEFFF78004A92440

其中前8位是前同步码,接下来是6位msg ID(0到63之间的整数),接下来的212位是数据,最后24位是CRC24.

所以在这种情况下,msg 26,我必须从212个数据位获取这些数据:

  • 4位整数值
  • 4位整数值
  • 从0到63.875的9位浮点值,其中LSB为0.125
  • 4位整数值

编辑:我需要在位级操作,因此memcpy不是一个好的解决方案,因为它复制了许多字节.要获得第一个4位整数值,我应该从一个字节获得2位,从下一个字节获得另外2位,移位每一对并组成.我要求的是一种更优雅的方法来提取值,因为我有大约20种不同的消息,并希望达到一个通用的解决方案来解析它们的位级别.

等等.

你知道os可以轻松实现这个吗?

我还发现了其他使用static_cast的Q/A. 我用Google搜索,并且对于推荐这种方法的每个人,还有另一个关于端序的警告.由于我已经有了我的消息,我不知道这样的警告是否适用于我,或者只是用于套接字通信.

编辑:提升:dynamic_bitset看起来很有希望.任何使用它的帮助?

c++ parsing bit-manipulation

4
推荐指数
1
解决办法
2475
查看次数