小编Ofe*_*lon的帖子

R data.table 是否记录为通过引用作为参数传递?

检查这个玩具代码:

> x <- data.table(a = 1:2) 
> foo <- function(z) { z[, b:=3:4]  }
> y <- foo(x)
> x[]
   a b
1: 1 3
2: 2 4
Run Code Online (Sandbox Code Playgroud)

看来 data.table 是通过引用传递的。这是故意的吗?这有记录吗?我确实阅读了文档,但找不到提及此行为。

我并不是询问 R 的文档化参考语义(在:=以及set***其他一些文档中)。我问 data.table 完整对象是否应该作为函数参数通过引用传递。


编辑:根据@Oliver 的回答,这里有一些更奇怪的例子。

> dt<- data.table(a=1:2)
> attr(dt, ".internal.selfref")
<pointer: 0x564776a93e88>
> address(dt)
[1] "0x5647bc0f6c50"
> 
> ff<-function(x) { x[, b:=3:4]; print(address(x)); print(attr(dt, ".internal.selfref")) }
> ff(dt)
[1] "0x5647bc0f6c50"
<pointer: 0x564776a93e88>
Run Code Online (Sandbox Code Playgroud)

因此,不仅.internal.selfref与调用者的 dt 副本相同,而且地址也相同。这确实是同一个物体。(我认为)。 …

r data.table

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

别名 - clang 优化器害怕什么?

拿这个玩具代码(godbolt链接):

int somefunc(const int&);
void nothing();

int f(int i) {
    i = somefunc(i);
    i++;
    nothing();
    i++;
    nothing();
    i++;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

从链接处的反汇编中可以看出,编译器i从堆栈重新加载 3 次,递增并存储回来。

如果somefunc修改为int按值接受,则不会发生这种情况

(1) 优化器是否“害怕”既然somefunc可以访问is 地址,就可以间接修改它?您能给出一个定义明确的代码示例吗?(请记住,const_cast'ing 和修改是未定义的行为)。

(2) 即使这是真的,我也希望装饰somefunc能够__attribute__((pure))阻止这种悲观情绪。事实并非如此。为什么?

这些 llvm 是否错过了优化?


编辑:如果somefunc返回 void,__attribute__((pure))则按预期启动:

void somefunc(const int&) __attribute__((pure));
void nothing();

int f(int i) {
    somefunc(i);
    i++;
    nothing();
    i++;
    nothing();
    i++;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

也许这个属性有点半生不熟(在实践中很少见)。

c++ llvm clang compiler-optimization

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

Windows SDK与Visual Studio

我们目前正面临VS和Windows SDK之间的一些冲突,我发现有一些基本的东西我不明白:
为什么MS为Windows发布两个独立的开发工具?我意识到WinSDK是免费的,并且不包含IDE - 但为什么要维护两组独立的头文件和库?WinSDK原则上不应该是VS版本的子集吗?

winapi visual-studio

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

VC++: crash when freeing a DLL built with openMP

I've reduced a crash to the following toy code:

// DLLwithOMP.cpp : build into a dll *with* /openmp
#include <tchar.h>
extern "C"
{
   __declspec(dllexport)  void funcOMP()
   {
#pragma omp parallel for
    for (int i = 0; i < 100; i++)
        _tprintf(_T("Please fondle my buttocks\n"));
   }
}
Run Code Online (Sandbox Code Playgroud)

_

// ConsoleApplication1.cpp : build into an executable *without* /openmp

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

typedef void(*tDllFunc) ();

int main()
{
    HMODULE hDLL = LoadLibrary(_T("DLLwithOMP.dll"));
    tDllFunc pDllFunc = (tDllFunc)GetProcAddress(hDLL, "funcOMP");
    pDllFunc();
    FreeLibrary(hDLL);
    // …
Run Code Online (Sandbox Code Playgroud)

msvcrt openmp visual-c++

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

Visual Studio插件,显示签入代码的人员

我对VS插件的屏幕截图有一个模糊的记忆,它根据谁给了他们最后的修改,为不同的代码部分着色.谁知道我在说什么?

(我正在进行本机c ++/MS Team源代码控制.我只希望这个工具,如果存在的话,支持这种配置)

plugins visual-studio

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

Linux 与 Windows 中的系统库

我的背景是 Windows,我是 Linux 菜鸟。仍然试图围绕一些基本概念,特别是系统库:

  1. Windows 有包装系统调用的 ntdll.dll 和一个 CRT dll,它在 C 语法与 ntdll 操作系统公开服务之间进行接口。
    (为简单起见,我忽略了 user32、kernel32、kernalbase 等中间层。我也意识到 CRT 是几个 dll,这不是重点)。
  2. 似乎 Unix/Linux 几乎只有 libc,它包装系统调用直接从您的应用程序代码中调用。

这是正确的比喻吗?(ntdll + CRT) <===> libc ?

我意识到 C 和 Unix 是一起进化的,但仍然感到惊讶。是否可以将 C 接口硬连接到 Unix/Linux 的操作系统中?在 Windows 中,非 C 程序链接到底层操作系统提供的 dll。在 Linux 中是否有可能没有 OS/C 运行时边界?

linux windows shared-libraries

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