检查这个玩具代码:
> 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 副本相同,而且地址也相同。这确实是同一个物体。(我认为)。 …
拿这个玩具代码(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)
也许这个属性有点半生不熟(在实践中很少见)。
我们目前正面临VS和Windows SDK之间的一些冲突,我发现有一些基本的东西我不明白:
为什么MS为Windows发布两个独立的开发工具?我意识到WinSDK是免费的,并且不包含IDE - 但为什么要维护两组独立的头文件和库?WinSDK原则上不应该是VS版本的子集吗?
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) 我对VS插件的屏幕截图有一个模糊的记忆,它根据谁给了他们最后的修改,为不同的代码部分着色.谁知道我在说什么?
(我正在进行本机c ++/MS Team源代码控制.我只希望这个工具,如果存在的话,支持这种配置)
我的背景是 Windows,我是 Linux 菜鸟。仍然试图围绕一些基本概念,特别是系统库:
这是正确的比喻吗?(ntdll + CRT) <===> libc ?
我意识到 C 和 Unix 是一起进化的,但仍然感到惊讶。是否可以将 C 接口硬连接到 Unix/Linux 的操作系统中?在 Windows 中,非 C 程序链接到底层操作系统提供的 dll。在 Linux 中是否有可能没有 OS/C 运行时边界?