在与我的团队中新来的开发人员讨论之后,我意识到在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++
如何将数组的一部分复制到另一个数组?
考虑一下我
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++中执行相同的任务?
我正在尝试优化我的代码,利用多核处理器来复制任何操作大型密集阵列.
对于复制:我有一个大密集阵列(大约6000x100000),我需要从中拉出15x100000子阵列,在管道上进行多次计算.该管道由许多线性代数函数组成,这些函数由blas处理,这是多核的.与线性代数相比,提取数据的时间是否真的重要是一个悬而未决的问题,但我要谨慎一点,并确保数据复制得到优化.
对于操作:我有许多不同的函数,通过元素或行来操作数组.如果每个都做多核,那将是最好的.
我的问题是:最好是使用正确的框架(OpenML,OpenCL)并让编译器发生所有的魔术,还是有更好的功能/库可以更快地完成这项工作?
使用memcpy和std::copy?之间的效率损失有多严重?
我有一种情况,我的系统上的矢量实现似乎没有使用连续的内存,这使得我必须稍后std ::复制其内容而不是做memcpy(dest, &vec[0], size);.我不确定这可能会对效率造成多大影响.
但是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很感兴趣.)
如果你想在两个数组之间进行内存复制,那么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)
这通常是比手动换循环的所有字符复制更快buf到result,因为它是一个块拷贝操作,仅仅需要一块内存,并将其写入到目标.
同样,如果我给了a char*并int指定了它的大小,我的选择是什么?这是我考虑过的:
src和dst成为数组或者,如果没有其他选择,是否有某种方法从指针char*和长度构造数组int?如果我能做到这一点,我可以将指针转换为数组并将它们传递给Array.Copy.
我不是在寻找for循环,因为正如我所说的那样,与块副本相比它们效率不高,但如果这是我认为必须做的唯一方法.
TL; DR:我基本上都在寻找memcpy(),但在C#中可以用于PCL.
我读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++
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行中的相同实例.在两者之间可能有许多修改.
希望我对我的问题很清楚.
谢谢
我有以下代码将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++中解析二进制消息的任何示例库.大多数人要求读取二进制文件或在套接字中接收的数据,但我只需要解码一组二进制消息.有人提到了boost :: spirit,但我找不到合适的例子来满足我的需求.
例如:9A690C12E077033811FFDFFEF07F042C1CE0B704381E00B1FEFFF78004A92440
其中前8位是前同步码,接下来是6位msg ID(0到63之间的整数),接下来的212位是数据,最后24位是CRC24.
所以在这种情况下,msg 26,我必须从212个数据位获取这些数据:
编辑:我需要在位级操作,因此memcpy不是一个好的解决方案,因为它复制了许多字节.要获得第一个4位整数值,我应该从一个字节获得2位,从下一个字节获得另外2位,移位每一对并组成.我要求的是一种更优雅的方法来提取值,因为我有大约20种不同的消息,并希望达到一个通用的解决方案来解析它们的位级别.
等等.
你知道os可以轻松实现这个吗?
我还发现了其他使用static_cast的Q/A. 我用Google搜索,并且对于推荐这种方法的每个人,还有另一个关于端序的警告.由于我已经有了我的消息,我不知道这样的警告是否适用于我,或者只是用于套接字通信.
编辑:提升:dynamic_bitset看起来很有希望.任何使用它的帮助?