我们有一个使用OpenGL用C++编写的蛋白质可视化的数学/科学应用程序.它是在过去几年中编写的,并广泛使用了GCC 4.4及更高版本中的C++ 0x功能.(它还可以在Windows上使用Microsoft Visual C++ 10进行编译,它支持许多C++ 0x功能.)
我们想要发布iPhone/iPad版本,因此我们需要将它从Linux/Windows移植到iPhone.我们用很少的努力移植了类似的程序 - 添加了一些Objective C文件,并完成了! - 但是,由于这里使用的C++ 0x功能,我们遇到了问题.OS X上的Xcode使用GCC 4.2.1(从2007年开始),它早于GCC的C++ 0x支持.将所有这些漂亮的C++ 0x代码重写为不使用C++ 0x功能似乎是一个巨大的倒退,我们真的不希望在向C++ 0x迈进时保持一个向后移植的代码库.
有没有办法使用GCC 4.5(或4.6,来自SVN)来定位iPhone和iPhone模拟器?如果是这样,怎么样?优选地,从Xcode内部,因为点击并运行/点击和调试功能非常有用.能够在Xcode的"C/C++编译器版本"框中输入"GCC 4.6"真是太棒了,只需让一切正常.
(顺便说一下,Clang的顶级版本 - 截至昨天! - 支持一些C++ 0x功能,但还不支持lambda表达式,所以它现在可能已经出现了. )
与在原始应用程序包中提交给Apple的原始可执行文件相比,当应用程序通过App Store购买并安装在用户的iPhone上时,应用程序的可执行文件是否逐字节相同?或者它是否不同(例如,使用其他签名或加密)?
我只关心可执行文件,而不是整个应用程序包.
特别是代码如......
int main(int argc, char* argv[]) {
FILE* file = fopen(argv[0], "rb");
// Read entire contents of executable file; calculate a hash value
// ...
fclose(file);
}
Run Code Online (Sandbox Code Playgroud)
...计算与原始提交的可执行文件上的iPhone外部哈希计算相同的哈希值?
例如,如上所述计算SHA256哈希然后使用XCode中的"构建并运行"在附加的iPhone上运行产生与通过openssl sha256 MyAppExecutableFile从OS X中的终端运行来计算SHA256哈希完全相同的结果.这意味着安装app通过XCode不会改变可执行文件.
我的问题是,当应用程序提交到App Store,购买和安装时,这是否仍然存在.
在Python 3.5+中,我常常会遇到这样一种情况,即我有很多嵌套协同程序,只是为了调用一个深层次的协程,await在大多数函数中只有一个尾调用,如下所示:
import asyncio
async def deep(time):
await asyncio.sleep(time)
return time
async def c(time):
time *= 2
return await deep(time)
async def b(time):
time *= 2
return await c(time)
async def a(time):
time *= 2
return await b(time)
async def test():
print(await a(0.1))
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
loop.close()
Run Code Online (Sandbox Code Playgroud)
这些功能a,b以及c可以写成返回协程,定期的功能,而不是为自己的协同程序,如下:
import asyncio
async def deep(time):
await asyncio.sleep(time)
return time
def c(time):
time *= 2
return deep(time)
def b(time):
time *= 2
return c(time) …Run Code Online (Sandbox Code Playgroud) 我有数据流连续进入许多TCP套接字.对于每一个,我有一个不同的正则表达式,我需要拉出匹配.例如,可以匹配格式##.#的数字,后跟字母f:
r = re.compile(rb'([0-9][0-9]\.[0-9])f')
Run Code Online (Sandbox Code Playgroud)
另一个可能匹配字母Q前面的###格式的数字:
r = re.compile(rb'Q([0-9][0-9][0-9])')
Run Code Online (Sandbox Code Playgroud)
实际上,表达式可能具有任意长度和复杂性,并且从配置文件中提取并且事先不知道.它们不是硬编码的.
当新数据进入时,我将其附加到类型的缓冲区bytearray()(此处称为self.buffer).然后我调用这样的函数(self.r作为编译的正则表达式):
def advance(self):
m = self.r.search(self.buffer)
# No match. Return.
if m is None:
return None
# Match. Advance the buffer and return the matched groups.
self.buffer = self.buffer[m.end():]
return m.groups()
Run Code Online (Sandbox Code Playgroud)
如果还没有匹配,则返回None.如果匹配,则返回匹配并丢弃缓冲区直到匹配结束,使其自己准备好再次调用.
但是,这种方法并不是特别有效.问题是必须一次又一次地扫描缓冲区 - 每当有新数据进入时 - 直到找到匹配为止.在找到匹配项并且可以提前启动缓冲区之前,可能会重复扫描数千次和数百万个字符.
在找到匹配项之前,我不能简单地丢弃缓冲区的内容,因为匹配可能需要缓冲区的最后几个字节(甚至整个缓冲区).一旦有更多数据进入,缓冲区的结尾可能是匹配的开始.
如何重写我的"advance"函数以安全地丢弃可能永远不会包含正则表达式开头的缓冲区部分,以便不需要重复扫描整个缓冲区?
一种可能性:如果未找到匹配的原因是因为字符串的结尾已到达,是否有"搜索"的替代方法返回"无"以外的内容?如果是这样,我可以获得潜在匹配的起始位置吗?这将允许我丢弃缓冲区到那一点.
另一种可能性:某种类型的库足够聪明,可以重写任意正则表达式,因此它们可以在截断的字符串上以不同的 - 可检测的 - 方式匹配.
我也会接受其他可能性,但他们需要使用任意正则表达式,而不仅仅是上面的简单表达式.理想情况下,他们也不会涉及两次扫描缓冲区(一次找到实际的潜在匹配,一次丢弃东西).
给定一个C ++向量(假设它是双精度数,我们称它为unsorted),最有效的方法是创建一个新的向量sorted,该向量包含一个排序的副本unsorted?
考虑以下简单的解决方案:
std::vector<double> sorted = unsorted;
std::sort(sorted.begin(), sorted.end());
Run Code Online (Sandbox Code Playgroud)
此解决方案有两个步骤:
unsorted。但是,在步骤1的初始副本中可能会浪费很多精力,尤其是对于(例如)已经被大量排序的大型矢量而言。
如果我用手编写此代码,则可以通过将第一遍读取unsorted向量中的值,同时将它们(根据需要进行部分排序)写入向量中,从而将排序算法的第一遍与步骤1结合起来sorted。根据算法,随后的步骤可能仅适用于中的数据sorted。
有没有办法使用C ++标准库,Boost或第三方跨平台库来执行此操作?
重要的一点是要确保sorted在排序开始之前,不必将C ++向量的内存不必要地初始化为零。许多排序算法将要求立即对sorted向量进行随机写入访问,因此使用,reserve()并且push_back()对于该第一遍将不起作用,但resize()会浪费时间初始化向量。
编辑:由于答案和评论不一定了解为什么“单纯的解决方案”效率低下,请考虑以下情况:unsorted数组实际上已经按排序顺序排序(或者只需要一次交换就可以排序)。在那种情况下,无论采用哪种排序算法,使用朴素的解决方案,每个值都至少需要读取两次-复制时一次,排序时一次。但是使用分时复制解决方案,读取次数可能减半,因此性能大约翻倍。unsorted当使用性能更高的排序算法std::sort(可能是O(n)而不是O(n log n))时,不管中的数据如何,都会出现类似的情况。