小编pau*_*ens的帖子

我应该采取什么预防措施来制作一个不会调用未定义行为的内存池?

我最初的问题是,在一个项目中,我有几个共享一生的对象(即,一旦我释放其中一个,我将释放它们全部),然后我想分配一个单独的内存块.我有三个不同的对象类型的数组,struct foo,void *,和char.起初我想要malloc()一个像这样的块:

// +---------------+---------+-----------+---------+---------+
// | struct foo[n] | padding | void *[m] | padding | char[o] |
// +---------------+---------+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

但那么......如果不调用未定义的行为,我怎么能做到这一点呢?即,尊重类型别名规则,aligment ...如何正确计算内存块大小,声明内存块(具有有效类型),以及如何正确地获取指向其中所有三个部分的指针?

(我明白我可以使用malloc()3个块,这会导致3个块,free()但我想知道如何使用单个块来执行它,同时仍然表现良好.)

我想将我的问题扩展到一个更普遍的问题:应该采取什么预防措施来为任意大小和对齐的对象实现内存池,同时保持程序的良好运行?(假设可以在不调用未定义行为的情况下实现它.)

c strict-aliasing undefined-behavior language-lawyer c11

28
推荐指数
3
解决办法
895
查看次数

我可以限制Haskell中每个函数/ monad/thread的内存使用量吗?

我正在研究一个旨在作为服务工作的研究编译器项目.其中一个要求是某些用户在处理其调用时可能具有有限的内存使用量(例如,"来自IP abcd的调用可能使用高达30mb的堆内存").

我用C语言编写的原型实现只是直接使用内存池malloc(实际上由于有效类型而很难实现).但是,手动内存管理.

有没有办法在Haskell中实现这一点,通过限制函数,monad或轻量级线程上的堆使用?(我接受其他功能语言的建议,这些建议可能允许我这样做.)

memory multithreading haskell ghc

10
推荐指数
1
解决办法
433
查看次数

Java 8中的Java"静态导入"与"导入静态"

我试图在Java上使用静态导入,但我写错了

static import java.lang.System.out;
Run Code Online (Sandbox Code Playgroud)

并编译代码(虽然找不到"out"符号),没有语法错误.

那么,"静态导入"实际上意味着什么呢?

java import static java-8

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

为什么Number类没有像add()或negate()这样的方法?

嗯,这是关于Java设计的问题.

为什么没有方法,如add()negate()java.lang.Number类,但也有一些它的子类的?

我的意思是......没有统一性.我可以使用+-运营商Float,Long和其他autoboxeable类,我可以使用add()negate()BigDecimalBigInteger(这违反了SRP).

因此,如果我们允许在Byte/ Short/ Integer/任何方面进行这些操作Long(使用自动装箱和操作员),为什么不直接添加abstract Number negate()等等Number

是否有一个原因?

java numbers

9
推荐指数
3
解决办法
481
查看次数

是否可以将多个heredoc表达式与正则表达式匹配?

是否有任何正则表达式引擎允许我匹配表达式上的多个heredoc字符串?例如,正如人们用Ruby写的那样:

f <<FOO, 10, <<BAR, 20
some text
FOO
some more text
BAR
Run Code Online (Sandbox Code Playgroud)

我想在Perl的风格中使用backrefs和递归调用,但无法设法使交叉序列依赖项工作(即,无法反转捕获的backrefs,因为FOO之前应匹配BAR).我还想过在.Net上平衡组,我可以通过使用前瞻反转堆栈(我知道,这是一个可怕的黑客),像这样:

(?:(?<x>foo|bar|baz)|\s)+(?(x)|(?!))\s*(?(x)(?=(.*?)(?<-x>(?<y>\k<x>)))){3}(?(x)(?!))(?:(?(y)(?<-y>\k<y>))|\s)+(?(x)(?!))(?(y)(?!))
Run Code Online (Sandbox Code Playgroud)

(点击这里进行测试.)

这匹配foo bar baz foo bar baz,但后来我必须添加一个手动计数器({3}),因为前瞻不会重复,+因为它不消耗我假设的任何输入.因此,这对任意案件都不起作用(但它很接近!).当然,我可以用{1000}任何其他大数字替换它,这将回答我的问题,但我想知道是否还有其他方法.

致谢:我确实理解将这种构造与正则表达式相匹配并不是一个好主意.我正在做这方面的研究工作,我想知道是否有可能.如果是,请不要在生产代码中使用它.

regex

8
推荐指数
1
解决办法
436
查看次数

Coq 中是否有可能将统一错误转化为目标?

我一直致力于 Coq 中流程演算的形式化(此处为存储库),并且不断发现自己尝试应用一个因等效但语法不同的子术语而失败的函数。这种情况经常是由于de Bruijn 变量的操纵而发生的。当统一失败时,我通常会事先明确替换行为不当的子项,然后应用我需要的函数。一个简单的代码作为我的意思的例子:

Require Import Lia.

Goal
  forall P: nat -> Prop,
  (forall a b c, P (a + (b + c))) ->
  forall a b c, P (b + c + a).
Proof.
  intros.
  (* Unification fails here. *)
  Fail apply H.
  (* Replace misbehaving subterms explictly. *)
  replace (b + c + a) with (a + (b + c)).
  - (* Now application succeeds. *)
    apply H.
  - (* Show now they …
Run Code Online (Sandbox Code Playgroud)

coq coq-tactic

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

有没有办法在Graphviz上绘制B树?

我试图生成类似于此的东西:

https://upload.wikimedia.org/wikipedia/commons/6/65/B-tree.svg

从内存中的btree ...有没有办法生成Graphviz上的图形,以便我可以生成*.dot文件?

谢谢.

dot graphviz

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

条件使用D中模板化方法中的局部变量

我不确定我是否使用了正确的术语,但我正在努力做出类似这样的事情:

struct test_t {
  int x;
  void test()() if(x == 10) {
    printf("X is ten!\n");
  };
  void test()() {
    printf("X is not ten!\n");
  };
};

test_t test;
test.x = 10;
test.test(); // output: X is ten!
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?我不会在现实代码中使用它,我只是想知道语言是否支持这样的东西.

templates d

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

将执行从一个线程移动到另一个线程以实现任务并行和逐个调用

我正在尝试在C++中实现一个call-by-future机制.虽然这只是一个测试代码(有点匆忙),但我打算使用类似于我正在研究的语言运行时的透明并行性.

我已经干了我正在努力的代码,使它变得更小,尽管它仍然很大:

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <future>
#include <thread>
#include <functional>
#include <type_traits>
#include <utility>
using namespace std;
using namespace std::chrono;

//------------------------------------------------------------------------------
// Simple locked printer

static std::recursive_mutex print_lock;

inline void print_() {
  return;
};

template<typename T, typename... Args>
inline void print_(T t, Args... args) {
  print_lock.lock();
  std::cout << t;
  print_(args...);
  print_lock.unlock();
};
//------------------------------------------------------------------------------

template<typename R>
class PooledTask {
  public:
    explicit PooledTask(function<R()>);

    // Possibly execute the task and return the value
    R &operator …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing concurrency multithreading c++11

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

C++ 11 - 检测运算符new []的方法

我正在尝试做这样的工作:

struct holder {
  std::function<void()> destroyer;

  template<typename T>
  holder(T) = delete;

  template<typename T>
  holder(std::enable_if< WAS CREATED WITH new > pointer) {
    destroyer = [=] { delete pointer; };
  };

  template<typename T>
  holder(std::enable_if< WAS CREATED WITH new[] > array) {
    destroyer = [=] { delete[] array; };
  };

  virtual ~holder() {
    destroyer();
  };
 };
Run Code Online (Sandbox Code Playgroud)

在某种程度上,我可以那么简单做return new test;,并return = new test[10];在会返回一个函数holder.但我发现它不会被视为一个数组,因为operator new[]返回一个指针.

有没有办法达到预期的效果?

谢谢!:)

c++ templates c++11

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

Emacs - * - lang - *标签和旧式K&R C.

我正在开发一个使用许多编程语言的大项目,而且我完全没有使用过Emacs的经验.我在Google上搜索了有关-*- this -*-工作原理的信息,但没有找到任何信息.

例如,如果我有一个文件test.krc,意味着在旧式K&R C中,我应该如何在其上标记这个以便Emacs识别?

如果有人能解释-*- lang -*-标签是如何工作的,我将不胜感激.

谢谢.

c emacs

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