我有一个内存堆管理器,它根据系统上的处理器数量将堆分成不同的段.内存只能分配给当前运行的线程处理器的分区.这将有助于不同的处理器继续运行,即使两个不同的处理器想要同时分配内存,至少我相信.
我找到了GetCurrentProcessorNumber()
Windows 的功能,但这仅适用于Windows Vista及更高版本.有没有一种适用于Windows XP的方法?
另外,这可以通过POSIX系统上的pthread来完成吗?
我正在写一个视频游戏,Humm和Strumm,它需要在游戏引擎中使用网络组件.我可以很容易地处理字节序的差异,但是我试图处理可能的float
内存格式时遇到了障碍.我知道现代计算机都有标准的整数格式,但我听说他们可能都不会将IEEE标准用于浮点整数.这是真的?
虽然我当然可以将它作为字符串输出到每个数据包中,但我仍然需要转换为每个客户端的"众所周知的格式",无论平台如何.标准printf()
并且atod()
不够.
请注意,因为这个游戏是一个可以在GNU/Linux,*BSD和Microsoft Windows上运行的免费/开源软件程序,所以我不能使用任何专有解决方案,也不能使用任何单平台解决方案.
干杯,
帕特里克
UTF-8可以编码5或6字节序列,允许编码所有Unicode字符吗?我的标准越来越矛盾了.我需要能够支持每个Unicode字符,而不仅仅是那些U + 0000..U + 10FFFF范围内的字符.
(所有引用均来自RFC 3629)
第3节:
在UTF-8中,使用1到4个八位字节的序列对来自U + 0000..U + 10FFFF范围(UTF-16可访问范围)的字符进行编码.一个"序列"的唯一八位字节将高阶位设置为0,其余7个字节用于编码字符编号.在n个八比特组的序列中,n> 1,初始八比特组将n个高阶比特设置为1,然后将比特设置为0.该八比特组的其余比特包含来自字符数的比特.要编码.以下八位字节都将高阶位设置为1,后面的位设置为0,每个字节留下6位以包含要编码的字符的位.
那么不是所有可能的字符都可以用UTF-8编码吗?这是否意味着我不能编码来自不同平面的字符而不是BMP?
第2节:
从未出现八位字节值C0,C1,F5至FF.
这意味着我们不能用5或6个八位字节编码UTF-8值(或者甚至是4个不在上述范围内的一些)?
第12节:
将字符范围限制为0000-10FFFF(UTF-16可访问范围).
看看之前的RFC证实了这一点......他们减少了字符的范围.
第10节:
编码为UTF-8时会出现另一个安全问题:UTF-8的ISO/IEC 10646描述允许编码高达U + 7FFFFFFF的字符数,产生最多6个字节的序列.因此,如果字符数范围没有明确限制为U + 10FFFF,或者缓冲区大小没有考虑到5字节和6字节序列的可能性,则存在缓冲区溢出的风险.
那么这些序列是否符合ISO/IEC 10646定义,而不是RFC 3629定义?我应该遵循哪一个?
提前致谢.
在线搜索,我发现以下例程用于计算IEEE格式的浮点符号.这也很容易扩展到双倍.
// returns 1.0f for positive floats, -1.0f for negative floats, 0.0f for zero
inline float fast_sign(float f) {
if (((int&)f & 0x7FFFFFFF)==0) return 0.f; // test exponent & mantissa bits: is input zero?
else {
float r = 1.0f;
(int&)r |= ((int&)f & 0x80000000); // mask sign bit in f, set it in r if necessary
return r;
}
}
Run Code Online (Sandbox Code Playgroud)
(来源:``32位漂浮物的快速标志'',Peter Schoffhauzer)
但是,由于二进制位操作,我厌倦了使用这个例程.我需要我的代码在具有不同字节顺序的机器上工作,但我不确定IEEE标准中有多少指定,因为我找不到今年发布的最新版本.有人能告诉我这是否有效,无论机器的字节顺序如何?
谢谢,帕特里克
在我正在编写的项目中,我有一个用作基础类的类模板,并且它具有一个派生类覆盖的虚拟方法。虚拟功能也有自己的实现。但是,我遇到的问题可以归结为以下代码:
#include <iostream>
template <typename T> struct A {
virtual void do_something()
#ifdef INLINE_CLASS
{ std::cout << "Saluton, mondo!\n"; }
#else
;
#endif
};
#ifndef INLINE_CLASS
template <typename T> virtual void A<T>::do_something() {
std::cout << "Saluton, mondo!\n";
}
#endif
int main(int argc, char** argv) {
A<int> a;
a.do_something();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用定义的INLINE_CLASS进行编译时,代码可以很好地编译,但是如果没有它,我将在GCC中收到错误消息:
pniedzielski@patrick-laptop-debian:~$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.7/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.7.2-5' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.7 --libdir=/usr/lib …
Run Code Online (Sandbox Code Playgroud)