这主要是一个我非常好奇的理论问题.(我不是试图通过自己编写或任何东西来做到这一点,我不是在重新发明轮子.)
我的问题是大写/小写等价表如何适用于Unicode.
例如,如果我必须在ASCII中执行此操作,我会使用一个字符,如果它在[az]范围内,我会将A和a之间的差值相加.
如果它不属于该范围,我会为10个左右的重音字符加上一个小等价表加上ñ.(或者,我可以只有一个包含256个条目的完整等价数组,其中大多数与输入相同)
但是,我猜测有一种更好的方法来指定Unicode中的等价,假设有数十万个字符,理论上,可以添加一种新语言或一组字符(我期待你当发生这种情况时,不需要修补窗口).
Windows是否为每个字符都有一个巨大的硬编码等价表?或者这是如何实现的?
一个相关的问题是SQL Server如何实现基于Unicode的重音不敏感和不区分大小写的查询.它是否有一个内部表格,告诉它éëeÉÉ和Ë都等同于"e"?
在比较字符串时,这听起来不是很快.
它如何快速访问索引?它是否已将索引值转换为其"基本"字符,对应于该字段的整理?
有谁知道这些东西的内部?
谢谢!
我希望获得.NET程序集中使用的所有字符串的列表,包括局部变量设置为"静态"值,传递给方法的参数,设置为的字段等.
我记得很久以前我读过的东西,.NET程序集包含了它所使用的所有字符串的表(或者它们可以被"实习") - 或者我只是在做梦?
使用.NET Reflector是一个很好的理想(感谢thijs),如果没有人提出已经编写的工具,我也会看看它的API.
(这是我可以编写一个工具来检查我们没有错过任何应该翻译的字符串.我可以处理C#源代码,但是我将不得不处理分裂在多行上的字符串等)
我想,我希望排除传递给CodeFlowException()等的字符串,所以这已经变得越来越复杂了.
PS:如果你能想到一套更好的标签,请重新提出这个问题.
在阅读Joel的文章Back to Basics并在SO上看到许多类似的问题之后,我开始想知道什么是具体的例子,知道像C这样的东西可以让你成为更好的高级程序员.
我想知道的是,有很多例子.很多时候,这个问题的答案就像" 了解C让你更好地了解幕后发生的事情 "或" 你需要为你的计划奠定坚实的基础 ",这些答案没有多大意义.我想了解您从了解低级概念中获益的不同具体方式,
Joel给出了几个例子:二进制数据库与XML和字符串.但是有两个例子并不能证明学习C和/或汇编是正确的.所以我的问题是:知道C让你成为更好的高级程序员的具体例子是什么?
这可能是一个重复的问题.我想知道windows进程的内存映射是什么样的?我正在寻找细节.请提供博客,文章和其他相关文献的链接.
在I/O安全方面,C标准库非常差.许多函数都有缓冲区溢出(gets,scanf),或者如果没有给出正确的参数(scanf),可能会破坏内存,依此类推.每隔一段时间,我就遇到一位有进取心的黑客,他自己编写了一个缺乏这些缺陷的图书馆.
你见过的这些图书馆有哪些最好的?您是否在生产代码中使用过它们,如果是这样,那么它们不仅仅是业余爱好项目?
据我所知,C中最小的单位是a byte.这种约束来自哪里?中央处理器?
例如,如何将一个nibble或一个单独写入bit文件?
在Python 3.2(和其他版本)中,os.open的文档说明:
此功能适用于低级I/O. 对于正常使用,使用内置函数open(),它返回一个带有read()和write()方法的文件对象(以及更多).要将文件描述符包装在文件对象中,请使用fdopen().
而对于fdopen() :
返回连接到文件描述符fd的打开文件对象.这是open()的别名并接受相同的参数.唯一的区别是fdopen()的第一个参数必须始终是一个整数.
这个评论对之间的差异问题io.open和os.open(此不同的是完全清楚对我来说,我一直使用io.open,从来没有os.open)问:为什么会有人选择Python低级别的I/O?,但没有真正得到答案.
我的问题是非常相似的带注释的问题:在Python中,什么是I/O通过低级别的使用情况下os.open,os.fdopen,os.close,os.read,等?我曾经认为需要对一个过程进行deamonise,但我不再那么肯定了.是否有任何任务只能使用低级I/O执行,而不能使用更高级别的包装器执行?
阅读本文时:http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv
我来到这句话:
最后一步,涉及模数除以2 ^ 10 - 1,具有将64位的每组10位(从位置0-9,10-19,20-29,...)合并在一起的效果值.
(它是关于反转数字中的位)...
所以我做了一些计算:
reverted = (input * 0x0202020202ULL & 0x010884422010ULL) % 1023;
b = 74 : 01001010
b
* 0x0202020202 : 1000000010000000100000001000000010
= 9494949494 :01001010010010100100101001001010010010100
& 10884422010 :10000100010000100010000100010000000010000
= 84000010 : 10000100000000000000000000010000
% 1023 : 1111111111
= 82 : 01010010
Run Code Online (Sandbox Code Playgroud)
现在,唯一有点不清楚的部分是1023(2 ^ 10 - 1)的大数量模块并给我反转位的部分......我没有找到关于位操作和位操作之间关系的任何好文档模数运算(旁边x % 2^n == x & (2^n - 1)))所以也许如果有人会对此有所了解,那将是非常有成效的.
在像x86这样提供缓存一致性的CPU上,从实际角度来看这有什么用呢?我知道这个想法是在一个核心上完成内存更新,在所有其他核心上立即可见.这是一个有用的属性.但是,如果不用汇编语言编写,就不能过分依赖它,因为编译器可以在寄存器中存储变量赋值,而不会将它们写入内存.这意味着必须采取明确的步骤,以确保在当前线程中可以看到在其他线程中完成的内容.因此,从实际角度来看,缓存一致性实现了什么?
我一直在思考这个问题:如何Object.GetHashCode在CLR或Java中实现?此方法的合同是,如果在同一对象实例上调用它,它应始终返回相同的值.
请注意,我在谈论GetHashCode()的默认实现.派生类不需要覆盖此方法.如果他们选择不这样做,它们本质上将具有引用语义:在哈希表和c中使用时,默认情况下等于"指针相等".这意味着,不知何故,运行时必须在整个生命周期内为对象提供一个常量哈希码.
如果我正在运行的机器是32位,并且如果对象实例从未在内存中移动,理论上可以返回对象的地址,重新解释为Int32.这样会很好,因为所有不同的对象都有不同的地址,因此会有不同的哈希码.
然而,这种方法存在缺陷,其中包括:
如果垃圾收集器将对象移动到内存中,则其地址会发生变化,因此违反协议的哈希码也会导致哈希码在对象的生命周期内应该是相同的.
在64位系统上,对象的地址太宽,无法容纳Int32.
由于托管对象倾向于与2的某个偶数幂对齐,因此最下面的位始终为零.当哈希码用于索引到哈希表时,这可能导致错误的分发模式.
在.NET中,System.Object由一个同步块和一个类型句柄组成,所以哈希码不能在实例本身中缓存.不知何故,运行时能够提供持久的哈希码.怎么样?Java,Mono和其他运行时如何做到这一点?