是否有一个标准repr的调用方法导致Python中的给定堆栈帧?如果不这样做,有没有一种很好的方法可以手动完成?
举个例子:
def some_call(*args, **kwargs):
print('{}({})'.format(
'some_call',
', '.join(itertools.chain(
map(repr, args),
('{}={!r}'.format(k, kwargs[k]) for k in kwargs)))))
>>> some_call(1, 2, a=3)
some_call(1, 2, a=3)
Run Code Online (Sandbox Code Playgroud)
我正在尝试记录某些调用,并且正在编写一个装饰器来记录对包装函数的调用以及完整的详细信息.我错了吗?
C++ 是否允许模板将具有静态存储的变量的地址作为参数?由于内存地址是完整的,并且那些具有静态存储的在编译时是已知的,这似乎是可能的。
我发现这个问题表明这适用于 int*。
将没有定义的静态 const int 的地址传递给模板是否合法?
到目前为止,我还没有说服我的编译器接受指向其他类型(如 char*)的指针。
模板通常可以专门用于静态地址吗?如果不是,为什么?
编辑:我应该更明确。这是一些使用 g++ 4.9 为我编译的代码。
#include <iostream>
template<int* int_addr>
struct temp_on_int{
temp_on_int() {}
void print() {
std::cout << *int_addr << std::endl;
}
};
template<char* str_addr>
struct temp_on_string{
temp_on_string() {}
void print() {
std::cout << str_addr << std::endl;
}
};
static int i = 0;
static char j = 'h';
// static char* k = "hi";
int main() {
temp_on_int<&i> five;
i = 6;
five.print();
temp_on_string<&j> h;
h.print();
// temp_on_string<k> …Run Code Online (Sandbox Code Playgroud) 我正在使用LLVM并且对它有些新意.
我无法通过降低堆栈帧来确定LLVM的含义.有人可以解释一下它是什么吗?
任何帮助表示赞赏
C++标准是否有效地要求std::unordered_map在内存中将每个键和值放在一起的符合实现?
我认为答案是肯定的,因为大部分内容std::unordered_map是按照术语来规定的std::pair,我不认为隐藏内存中不相交的键值对的细节所需的操作可以完全隐藏,但我不确定.
何时抛弃const非法?
在许多情况下,const它只是用户利益的注释,由编译器强制执行.这个问题要求什么时候抛弃const是严格违法的,C99标准的哪一部分禁止它(如果有的话)?
我怀疑在某些情况下它一定是非法的,因为我发现const全局范围内的函数指针有时被gcc内联.如果这些函数指针可以在程序的后期合法修改,那么这种优化将是无效的.另外我很确定我已经阅读了关于何时丢弃const在StackOverflow上是非法的解释,但我找不到它.(我认为答案是const只有当一个变量最初没有被声明为时才能抛弃const.)
我已经标记了这个C99,因为我希望这是C99标准中指定的内容,但如果答案可以解释C99的gcc,clang和MSVC实现的共同行为,那么这对我来说也足够了.
(显然这是一个非常基本的问题,所以我确实试过并没有找到专门针对C标准的副本.如果其他人可以指出我一个完全重复,我会很乐意结束投票.在任何一种情况下,我认为这个问题标题至少可以帮助SSO解决这类问题.)
Rust 文档给出了这个示例,其中我们有一个Result<T, E>named 实例some_value:
match some_value {
Ok(value) => println!("got a value: {}", value),
Err(_) => println!("an error occurred"),
}
Run Code Online (Sandbox Code Playgroud)
有没有方法可以在some_value没有模式匹配的情况下阅读?甚至没有在运行时检查内容的类型怎么样?也许我们以某种方式绝对肯定地知道包含什么类型,或者我们可能只是一个糟糕的程序员.在任何一种情况下,我只是想知道它是否可能,而不是它是一个好主意.
它让我觉得这是一个非常有趣的语言特征,这个分支是如此困难(或不可能?)来避免.
OpenGL API的用户通常使用诸如GLEW之类的库,或者很高兴在运行时加载OpenGL函数.为什么动态加载首选链接方法?
静态链接显然不是一种选择,因为使用OpenGL的程序通常由作者编译并分发给具有针对其特定图形卡的不同OpenGL库的用户.
这留下了动态链接和动态加载.似乎动态链接可以工作,因为我们知道我们想要访问的所有函数的名称.
动态链接是否可行?如果没有,为什么?如果是这样,为什么动态加载是首选?
考虑这两个功能.
int foo(const int& a) {
return a + 5;
}
int bar(const int a) {
return a + 5;
}
Run Code Online (Sandbox Code Playgroud)
给定这些函数,g ++ - 4.9在完全优化时生成以下代码.
Run Code Online (Sandbox Code Playgroud)g++-4.9 -std=c++11 -Ofast -march=native -DNDEBUG -fno-exceptions -Wall -S -o test17.S test17.cpp
# foo
movl (%rdi), %eax
addl $5, %eax
ret
# bar
leal 5(%rdi), %eax
ret
Run Code Online (Sandbox Code Playgroud)
这台机器是x86-64 Mac.
为什么编译器在这里"文字化"?
我的理解是,C++中的引用通常是作为指针实现的,但这并不是标准规定的.它们最好被理解为变量的别名.详细信息留待实施.
鉴于引用实际上不需要指针,为两个函数生成相同的代码似乎是一个明显的优化.生成这const int两个函数的代码是否合法?这两个函数之间是否存在可观察到的差异?
是否可以将函数指针映射到std::string符合标准的C++中?
对象指针的转换函数指针甚至做指针运算都是函数指针的限制,但是在这个相关的问题中
给出以下代码:
int (*funcptr)() = main;
unsigned char *p = (unsigned char *)&funcptr;
int i;
for (i = 0; i < sizeof funcptr; i++)
{
printf("%02x ", p[i]);
}
putchar('\n');
Run Code Online (Sandbox Code Playgroud)
该代码经受了同行的审查.我有点困惑.使用数组语法访问函数指针是合法的,但指针算术不是?
这就是我现在所拥有的.我的编译器没有抱怨,并且样本大小为1的东西似乎表现得很好.
template<class F>
std::string fptr_to_str(F fptr)
{
auto fptr_bytes = (const char*)fptr;
return {fptr_bytes, sizeof(fptr_bytes)};
}
Run Code Online (Sandbox Code Playgroud) 的返回类型boost::bind,现在std::bind是不确定的.
为什么返回类型boost::bind现在std::bind未指定?为什么不喜欢boost::function和std::function?
我意识到目的是通过类型推导来引用返回类型,但这并不能解释为什么std::bind特殊.
如果那只是委员会的心血来潮那么好,没有什么可说的,但是有一个技术原因,指定一个返回类型std::bind是唯一的负担或不指定它允许更有效的实现?