小编Ant*_*eru的帖子

在C/C++中将UTF-8字符串存储在内存中的最佳方法是什么?

查看unicode标准,他们建议使用plain chars来存储UTF-8编码的字符串.这是否与C++和基本的预期一致std::string,或者存在UTF-8编码可能产生问题的情况?

例如,在计算长度时,它可能与字节数不同 - 这应该如何处理?阅读标准,我可能很好地使用char数组进行存储,但我仍然需要自己编写类似的函数strlen,这些函数用于编码文本,因为据我所知,问题是,标准例程是仅限ASCII,或期望宽文字(16位或更多),这是unicode标准不推荐的.到目前为止,我发现关于编码内容的最好的来源是关于Joel的软件上的帖子,但它没有解释我们可怜的C++开发人员应该使用的:)

c++ unicode

9
推荐指数
1
解决办法
5379
查看次数

用于C++的最小XML库?

哪些XML库是最小的,易于使用,附带很少的依赖(理想情况下没有),可以静态链接并带有自由许可证?到目前为止,我一直是TinyXML的用户,但我很好奇到目前为止我错过了什么替代方案.

c c++ xml

7
推荐指数
2
解决办法
2090
查看次数

使用内部同步实现作业列表

我正在研究一个简单的工作线程框架,它与id Tech 5 Challenges中描述的框架非常相似.在最基本的层面上,我有一组作业列表,我想在一堆CPU线程中安排这些列表(使用标准线程池进行实际调度.)但是,我想知道这个信号/等待的东西是怎么回事在等待列表中可以有效地实现.据我了解,如果信号令牌尚未执行,则等待令牌会阻止列表执行.这隐含地意味着信号之前的所有内容必须在信号可以被提升之前完成.所以我们假设我们有一个这样的列表:

J1, J2, S, J3, W, J4
Run Code Online (Sandbox Code Playgroud)

然后调度可以像这样:

#1: J1, J2, J3
<wait for J1, J2, run other lists if possible>
#2: J4
Run Code Online (Sandbox Code Playgroud)

然而,这并不像它看起来那么容易,因为给定一组名单,我将不得不将部分之间readywaiting,也有特殊代码的信号和标签的东西在他们之前收集的所有作业,让他们可以触发信号,当且仅当他们都完成的(意为实例,它是不再可能的工作添加到列表中,同时执行它,如下面的信号访问先前插入作业).

是否有任何"标准"的方式有效地实现这一点?我也想知道如何最好地安排作业列表执行,现在,每个核心抓取一个作业列表,并安排其中的所有作业,这提供了非常好的扩展(对于32k作业,0.7毫秒,我得到101%,我猜部分原因是单线程版本有时被安排到不同的核心上.)

parallel-processing performance multithreading scalability

7
推荐指数
1
解决办法
415
查看次数

在Clang/MacOS X上捕获派生的异常类型失败

我有一个C++库,我试图在使用Clang的Mac OS X上运行.该库由DLL和Unit-Test可执行文件组成.它与GCC和MSVC编译良好,使用GCC,我使用以下设置:

  • 该库是用.编译的 -fvisibility=hidden
  • 所有公开的类都明确标记为 __attribute__(visibility("default"))
  • 该库有一些异常类,派生自std::runtime_error.所有这些类都标记为默认可见性.有一个根类LibraryException,从中可以派生出更具体的异常.
  • 在GCC上,我使用-std=c++0xclang,库和单元测试可执行文件都是用-stdlib=libc++ -std=c++11

在Mac OS X上,单元测试框架现在失败,因为异常类型错误.即这样的测试失败:

// bla.foo () throws CustomException, which is derived from LibraryException
TEST_THROWS (bla.foo (), CustomException)

// This works however
TEST_THROWS (bla.foo (), LibraryException)
Run Code Online (Sandbox Code Playgroud)

我验证了我的自定义异常类的typeinfo和vtable是使用导出的nm -g library.dylib | c++filt -p -i.这似乎是所有例外的情况......这到底是怎么回事?我试图调试错误,我看到如何在库中抛出正确的类型,但相同的类型不能在单元测试可执行文件中捕获.Clang是否有特殊要求让这个工作?我正在使用SVN最新的googletest框架进行测试.

一个小的测试程序表现出同样的问题:

try {
    funcThatThrowsCustomExceptionFromLibraryDylib ();
} catch (CustomException& e) {
    // doesn't get here
} catch (LibraryException& e) {
    // does get here
    // after demangle, this prints CustomException …
Run Code Online (Sandbox Code Playgroud)

c++ macos porting clang

7
推荐指数
1
解决办法
1414
查看次数

在Vista上抓住"程序停止工作"

在Vista上,我遇到了应用程序崩溃处理程序的问题.基本上,如果出现SEH无法捕获的意外情况,我会在弹出窗口中显示"应用程序停止工作",blablabla,"关闭程序/调试程序" - 也就是说,在我禁用错误报告后使用系统控制面板.启用错误报告后,您将获得一个任务对话框,可以在线搜索解决方案,关闭,调试.

如果它发生在自动化工具中,这不是那么有趣,我想知道是否有一种方法可以完全摆脱它,读取,如果我的应用程序崩溃,它只是崩溃到命令行或消失但没有提出对话框.

c windows-vista

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

SSE:将__m128转换为float

我有以下C代码:

__m128 pSrc1 = _mm_set1_ps(4.0f);
__m128 pDest;
int i;
for (i=0;i<100;i++) {
       m1 = _mm_mul_ps(pSrc1, pSrc1);      
       m2 = _mm_mul_ps(pSrc1, pSrc1);        
       m3 = _mm_add_ps(m1, m2);             
       pDest = _mm_add_ps(m3, m3); 
}

float *arrq = (float*) pDest;
Run Code Online (Sandbox Code Playgroud)

直到for循环结束的所有内容都有效.我现在要做的是将__m128类型转换回float.因为它存储了4个浮点数,我认为我很容易将其转换为浮动*.我究竟做错了什么?(这是一个测试代码,所以不要怀疑).我基本上尝试了所有可能的转换.谢谢你的帮助.

c c++ sse

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

如何将strerror_l与当前语言环境一起使用?

我正在修复一些使用strerror(不是线程安全的)多线程的Linux代码.我发现strerror_r并且strerror_l都是线程安全的.由于不同的定义strerror_r(取决于_GNU_SOURCE它的定义不同)我想使用更新的strerror_l函数,但我应该如何获取locale_t当前语言环境的对象?我没有使用iconv或任何东西,只是简单的libc,我不知道如何获得"默认语言环境"对象(我不关心错误打印的语言,我只想要一个人类可读的字符串. )

linux posix strerror

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

C++中的便携式wchar_t

在C++中是否有可移植的wchar_t?在Windows上,它的2个字节.其他一切都是4个字节.我想在我的应用程序中使用wstring,但如果我决定将其移植到端口,这将导致问题.

c++ windows portability wchar-t wstring

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

在OpenGL中设置mat4

我一直在阅读一些关于着色器的(基本)教程.到目前为止,他们已经介绍了如何在着色器中设置变量.但这只是关于整数,浮点数或向量.我找不到任何关于如何设置mat4变量的信息.我的着色器需要以下内容:

uniform vec3 CameraPos;
uniform mat4 ModelWorld4x4;
Run Code Online (Sandbox Code Playgroud)

所以相机位置和模型的世界矩阵.我想我有CameraPos,但我怎么设置ModelWorld4x4变量?


这就是我设置vector3的方法

campos = glGetUniformLocation(shader.id(), "CameraPos");
glUniform3f(campos, 0.0f, 0.0f, 3.0f);
Run Code Online (Sandbox Code Playgroud)

这是(方法之一)我试图设置mat4

glGetFloatv(GL_MODELVIEW_MATRIX, modelworld);
modelw = glGetUniformLocation(shader.id(), "ModelWorld4x4");
glUniformMatrix4fv(g_modelworld4x4, modelworld); // Not working
Run Code Online (Sandbox Code Playgroud)

我正在使用Assimp库加载模型,因此目前世界矩阵存储在aiMatrix4x4结构中.

// world matrix of the model
aiMatrix4x4 m = nd->mTransformation;

// Save in a global variable
g_modelworld4x4 = m;
Run Code Online (Sandbox Code Playgroud)

opengl glsl

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

比较两个字符串的最佳或最快方法是什么?

我不确定下面的代码有多快.如果有人知道比这更快/更优化的代码,请告诉我.

int xstrcmp(char *s1, char *s2)
{
  while (*s1 == *s2++)
            if (*s1++ == 0)
                    return (0);
  return (*(const unsigned char *)s1 - *(const unsigned char *)(s2-1));
}
Run Code Online (Sandbox Code Playgroud)

c++ string performance

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