小编Ben*_*igt的帖子

为什么VS2008 std :: string.erase()会移动它的缓冲区?

我想逐行读取文件并捕获一个特定的输入行.为了获得最大性能,我可以通过读取整个文件并使用指针迭代其内容以低级方式执行此操作,但此代码对性能不重要,因此我希望使用更具可读性和类型安全的标准库样式实现.

所以我拥有的是:

 std::string line;
 line.reserve(1024);
 std::ifstream file(filePath);
 while(file)
 {
    std::getline(file, line);
    if(line.substr(0, 8) == "Whatever")
    {
        // Do something ...
    }
 }
Run Code Online (Sandbox Code Playgroud)

虽然这不是性能关键代码,但我在解析操作之前调用了line.reserve(1024)来排除字符串的多次重新分配,因为读入较大的行.

在std :: getline里面,在添加每行的字符之前删除字符串.我逐步完成了这段代码,以满足自己每次迭代都没有重新分配内存,我发现这些内容让我的大脑充满了热情.

深入string :: erase而不是仅将其size变量重置为零实际上正在调用memmove_s,其指针值会覆盖缓冲区的使用部分,紧跟其后的缓冲区的未使用部分,除了memmove_s正在使用count参数调用零,即请求移动零字节.

问题:

为什么我想在我可爱的循环中调用库函数调用的开销,特别是那个被调用什么都没做的东西?

我自己还没有选择它,但在什么情况下,这个调用实际上什么都不做,但实际上会开始移动大块的缓冲区?

为什么这样做呢?

奖金问题:C++标准库标签是什么?

c++ visual-studio-2008 c++-standard-library

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

使用指向char的指针时访问冲突写入位置

我正在写一个非常简单的程序,从字符串中删除重复的字符.我运行了visual studio并得到了错误:

inteviews.exe中0x00d110d9处的未处理异常:0xC0000005:访问冲突写入位置0x00d27830.

我真的不明白这是什么问题.当前单元格获取下一个单元格的值.

void remove(char *str, char a) {
    while (*str != '\0') {
        if (*(str+1) == a) {
            remove(str + 1, a);
        }

        *str = *(str +1 );//HERE I GET THE ERROR
        ++str;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    char *str = "abcad";

    while (*str != '\0') {
        remove(str,*str);
        str++;
    }

    std::cout << str << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我已经尝试将其更改为char str[] = "abcad"但我仍然得到相同的错误.

c++ string c-strings

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

我是否需要在实现IDisposable的每个对象中使用"using"关键字?

我正在调用第三方库,其中有很多类实现了IDisposable.

我是否需要在所有这些模式上使用模式?

.net c# idisposable using-statement

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

sizeof std :: array是否等于普通旧数组的大小?

它有保证sizeof (std::array<T, N>) == N * sizeof (T)吗?

请提供C++标准的支持.

还有一个相关的问题有关std::tr1::array.


为了帮助您入门:

std::array是一个聚合.如果TPOD,那也是std::array<T, N>.这使它也成为标准布局.

应该有一些标准参考连接到禁止填充(允许对齐填充,但数组长度已经是其对齐的倍数).

c++ arrays containers language-lawyer

5
推荐指数
0
解决办法
105
查看次数

匹配字符串中第一次出现的分号,只有前缀为' - '

我正在尝试编写一个Java的正则表达式,如果有一个分号没有两个(或更多)前导' - '字符,则匹配.

我只能做相反的工作:一个至少有两个前导' - '字符的分号.

([\-]{2,}.*?;.*)
Run Code Online (Sandbox Code Playgroud)

但我需要类似的东西

([^([\-]{2,})])*?;.*
Run Code Online (Sandbox Code Playgroud)

我不知道怎么说不能表达"至少两个字符".

以下是我需要使用表达式评估的一些示例:

; -- a           : should match
-- a ;           : should not match
-- ;             : should not match
--;              : should not match
-;-              : should match
---;             : should not match
-- semicolon ;   : should not match
bla ; bla        : should match
bla              : should not match (; is mandatory)
-;--;            : should match (the first occuring semicolon must not have two or more consecutive …
Run Code Online (Sandbox Code Playgroud)

java regex

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

当有几何着色器时,是否需要在顶点着色器中写入 `gl_Position`

假设我有一个几何着色器,它gl_Positiongl_in[].gl_Position. 如果之前的流水线阶段(顶点和镶嵌)没有写入它们的out gl_Position,整个流水线的动作是否仍然保持良好定义?

或者换句话说gl_Position,在几何着色器完成之前, 的值是否对 GL 的功能有任何影响?如果没有,这意味着我可以简单地将它用作传递数据的额外插槽,而无需在阶段之间进行任何特殊的空间解释,对吗?

(问题假设 OpenGL 4.5 正向配置文件。)

opengl glsl

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

对于不是从0开始的缓冲区,GetBytes是否有一种不太痛苦的方法?

我不得不处理项目中的原始字节,我需要基本上做这样的事情

byte[] ToBytes(){
  byte[] buffer=new byte[somelength];
  byte[] tmp;
  tmp=BitConverter.GetBytes(SomeShort);
  buffer[0]=tmp[0];
  buffer[1]=tmp[1];
  tmp=BitConverter.GetBytes(SomeOtherShort);
  buffer[2]=tmp[0];
  buffer[3]=tmp[1];
}
Run Code Online (Sandbox Code Playgroud)

我觉得这是错的,但我找不到更好的办法.有没有更简单的方法?

c# bytearray bitconverter

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

是否存在使用不会丢弃物体的情况?

是否有任何情况下使用不会处理它应该处理的对象?

例如,

using(dbContext db = new dbContext()){ ... }
Run Code Online (Sandbox Code Playgroud)

有没有办法在最后一个}数据库仍然存在之后?

如果出现这种情况怎么办:

object o =  new object();
using(dbContext db = new dbContext()){
 o = db.objects.find(1);
}
Run Code Online (Sandbox Code Playgroud)

是否有可能o保持db活力?

c# using-statement

4
推荐指数
2
解决办法
2783
查看次数

在C++中,(long long)x与(long long)floor(x)相同吗?

假设我有一个双数据类型,变量名为'x'.是否有必要将double转换为long long数据类型给出与转换为long long floor(x)相同的结果.

c++ casting rounding

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

json 净前导零(禁用基数转换)

Json.Net 无法正确反序列化带有前导零的数字。

例如{ "number":010 }识别为 8(因为0108 基等于810 基)

如果看JsonTextReader.ParseNumber()你可以看到

long value2 = text2.StartsWith("0x", StringComparison.OrdinalIgnoreCase) ? Convert.ToInt64(text2, 16) : Convert.ToInt64(text2, 8);
Run Code Online (Sandbox Code Playgroud)

怎么可能禁用 base-cast?也许可以更换JsonTextReader

c# json json.net

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