小编Pra*_*tic的帖子

Smalltalk如何操纵调用堆栈帧(thisContext)?

Smalltalk对象thisContext看起来奇怪而奇妙.我无法理解它是什么以及它是如何工作的.甚至它如何实现延续.

对于C的调用栈,我可以很容易地想象它是如何实现和工作的.但为此......我做不到.请帮我理解一下.

continuations callstack smalltalk stack-frame

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

为什么“控制到达非无效函数的末尾”仅是警告?合法吗

用非空返回类型定义函数是否合法,这使控件可以到达函数的末尾而不是返回语句吗?

gcc并且clang仅对此发出警告。这些代码合法吗?或者这些编译器是否慷慨?

gcc:

警告:函数中没有return语句,返回非空[-Wreturn-type]

铛:

警告:控制到达非无效函数的结尾[-Wreturn-type]

如果这是合法的,那么对于返回的值是否存在定义的行为?

c++ return-value compiler-warnings undefined-behavior

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

哪些事件会导致 ferror 返回非零值?

哪些事件会导致ferror()返回非零值,在哪些事件之后应该检查ferror()

http://www.cplusplus.com/reference/cstdio/ferror/

打开,阅读,关闭?

的返回值ferror()会自发变化吗?例如,如果程序检查ferror(stream),在不与FILE关联的对象交互的情况下小睡一会儿stream,然后ferror(stream)再次检查,返回值是否会有所不同?

是否有任何标准强制要求?

c error-handling file-io

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

可以安全地从具有C风格链接的函数返回类模板吗?

如果调用者和函数都同意类的内存布局(即相同的编译器和设置),那么具有C风格链接的函数返回从类模板实例化的类是否安全?

例:

#include <vector>
#include <iostream>

extern "C" std::vector<int> foo()
{
    return {{1, 2, 3}};
}

int main()
{
    const auto v = foo();
    for (const auto& i : v)
        std::cout << i << " ";
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

该程序使用g ++ 4.9.2和clang 3.5进行编译和运行.g ++没有发出警告,但clang发出以下内容:

test.cpp:4:29:警告:'foo'指定了C-linkage,但返回了不完整类型'std :: vector',它可能与C [-Wreturn-type-c-linkage]不兼容

这个错误对我来说没有意义,因为std::vector<int>它不是一个不完整的类型.这段代码创建了一个完整类型的std::vector<int>演示实例std::vector<int>.

c++ templates linkage

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

确定cmake_minimum_required()的适当版本

从一组CMakeLists.txt文件中,如何确定适当的版本号cmake_minimum_required()?有没有比熟悉CMake功能的历史和使用反复试验更好的方法?

cmake

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

沉默CMP0048供应项目中的警告

我有git子模块,CMakeLists.txt其中包含由于CMP0048而导致警告的文件.警告看起来像这样:

CMake Warning (dev) at submodule_directory/CMakeLists.txt:24 (project):
  Policy CMP0048 is not set: project() command manages VERSION variables.
  Run "cmake --help-policy CMP0048" for policy details.  Use the cmake_policy
  command to set the policy and suppress this warning.

  The following variable(s) would be set to empty:

    PROJECT_VERSION
    PROJECT_VERSION_MAJOR
    PROJECT_VERSION_MINOR
    PROJECT_VERSION_PATCH
This warning is for project developers.  Use -Wno-dev to suppress it.
Run Code Online (Sandbox Code Playgroud)

我不控制这些CMakeLists.txt文件,我不想分叉,所以没有什么可以做的,我只是想让CMake闭嘴.cmake_policy(SET CMP0048 OLD)在添加子模块目录之前使用并不能解决这个问题.(我想project()重置cmake政策?).

我能做些什么吗?

cmake

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

固定大小的数组与 alloca(或 VLA)

什么时候alloca()通过声明固定大小的数组来分配在堆栈上的内存更可取?


细节:

As we know, alloca() is a controversial function. Used recklessly, it can cause stack overflow. Used judiciously, it can shave a few nanoseconds from a tight loop by avoiding heap allocation. In this question about why alloca is considered bad, several of the top answers advocate for the occasional use of alloca.

Another way to allocate from the stack is to simply declare a fixed size array. An example of this strategy can be found …

c c++ performance alloca

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

允许C++和C流独立缓冲有什么潜在的好处?

C++ iostreams控制C++流是否必须与C流同步std::ios_base::sync_with_stdio().关闭流同步允许标准库实现为C++流和C流使用独立的非同步缓冲区,以潜在地提高性能.

为实施者使用单独的独立io缓冲区用于C和C++流,为什么要打开一扇门是重要的?与一组io缓冲区相比,我没有看到这可能如何提高性能.在程序级别允许标准库一组io缓冲区可以减少通常昂贵的对底层OS io工具的调用次数,但是两组io缓冲区的优势是什么呢?

是否存在技术原因,C和C++流的单独缓冲区可以使性能受益,或者设计只是一个历史工件?

它是否与委员会有什么关系,希望C++实现者能够通过构建现有的C标准库实现来实现C++标准库?


我正在寻找的不仅仅是"标准这么说".

如果需要操作系统特性来解释基本原理,欢迎使用答案作为实际操作系统提供的io工具的示例,或者解释假设但合理的操作系统.


编辑:为了澄清,问题不是同步流可能会损害性能的原因.问题是为什么C++标准的设计假设可能有两组io缓冲区,为什么保持开放这种可能性对实现者有用.std::ios_base::sync_with_stdio()恰好是这种假设的结果.

c++ standards iostream buffering c++-standard-library

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

考虑到GIL,异步怎么可能不是线程安全的?

异步文档阅读:

大多数异步对象不是线程安全的。您仅应担心在事件循环之外访问对象。

有人可以解释一下还是举一个例子说明如何滥用asyncio导致线程之间共享的对象不同步写入?我认为GIL意味着一次只能有一个线程可以运行解释器,因此解释器中发生的事件(例如读取和写入Python对象)在线程之间是微不足道的同步。

上面引用的第二句话听起来像个线索,但我不确定该怎么做。

我猜想线程可能总是会因释放GIL并决定以任何方式写入Python对象而造成严重破坏,但这不是特定于asyncio的,因此我认为文档不是这里所指的。

这是否可能是异步PEP保留某些异步对象不是线程安全的选项的问题,即使目前在CPython中的实现恰好是线程安全的呢?

python cpython python-multithreading thread-synchronization python-asyncio

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

GHC如何实现unsafePerformIO?

unsafePerformIO从RTS、libc 或操作系统 API开始和结束,GHC 如何实现 IO?


我试图了解当标准前奏不可用时 IO 在 Haskell 中如何工作(例如,如果我们出于某种原因自己实现标准前奏)。

我原本希望在 GHC 的 Haskell 代码中找到对 C 函数的包装调用,但事实并非如此。unsafePerformIO建立在其之上,runRW#这是重魔法开始的地方,我们开始撞上那些未在 Haskell 中实现、而是内置于编译器中的函数和类型。runRW#似乎能够对现实世界的状态(即 a State# RealWorld)运行 IO 操作。

尝试从另一个方向走,我在RTS中还没有找到立足点。它似乎不包含我期望的像fread()andfwrite()read()and 之类的函数的调用write()

我在哪里继续关注 IO 实现?从现在开始的基本路线图是什么?

linux haskell ghc

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