如果我将一个字符串文字分配给a char*,即使使用了许多迂腐选项(-Wall -W -pedantic -std=c99),GCC和Clang都不会抱怨:
char *foo = "bar";
Run Code Online (Sandbox Code Playgroud)
而他们(当然)不要抱怨,如果我分配const char*到char*.
这是否意味着字符串文字被认为是char*类型?他们不应该const char*吗?如果它们被修改,它就不是定义的行为!
和(一个不相关的问题)命令行参数(即:):argv它被认为是一个字符串文字数组?
这可能是一个愚蠢的问题,但如何sleep(),wait(),pause(),职能的工作?
我知道编译器在实现std::type_info函数行为方面有很大的自由度.
我正在考虑使用它来比较对象类型,所以我想确定:
std::type_info::name 必须为两种不同类型返回两个不同的字符串.
std::type_info::before必须说,Type1是前 Type2 异或 Type2为之前 Type1.
// like this:
typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) )
Run Code Online (Sandbox Code Playgroud)相同模板类的两种不同的特化被认为是不同的类型.
typedef相同类型的两个不同定义是相同类型.
最后:
由于std::type_info不可复制,我怎么能type_info在某处存储(例如:在a中std::map)?唯一的方法是std::type_info总是分配一个地方(例如:在堆栈上或静态/全局变量上)并使用指向它的指针?
的速度有多快operator==,operator!=以及before对最常见的编译器?我猜他们应该只比较一个值.速度有多快typeid?
我有一个类A有virtual bool operator==( const A& ) const.由于A有许多子类(其中一些在编译时是未知的),我会以B这种方式在任何子类中重载该虚拟运算符:
virtual bool operator==( const A &other ) const {
if( typeid(*this) != typeid(other) ) return …Run Code Online (Sandbox Code Playgroud)我在C中实现了一些排序算法(排序整数),小心地uint64_t用来存储与数据大小有关的任何东西(因此也是计数器和东西),因为算法也应该用几千兆的数据集进行测试整数.
算法应该没问题,并且分配的数据量应该没有问题:数据存储在文件中,我们每次只加载很少的块,即使我们将内存缓冲区扼流到任何大小,一切也能正常工作.
使用高达4千兆字节的数据集进行测试(因此16GB的数据)工作正常(分类4Gint需要2228秒,约37分钟),但是当我们超过那个(即:8 Gints)时算法似乎没有停止(它是现在已经跑了大约16个小时).
我担心问题可能是由于整数溢出,也许循环中的计数器存储在32位变量上,或者我们可能正在调用一些与32位整数一起工作的函数.
还有什么呢?
有没有简单的方法来检查运行时是否发生整数溢出?
在阅读sbi和Eli Bendersky在这个问题中的答案后,我开始想知道静态成员函数的用途.
一个类的朋友免费功能应该不能做任何静态成员函数可以做的事情?如果是这样,为什么/何时我应该更喜欢静态成员函数给朋友免费?
我正在寻找两个在概念上类似于这些的功能:
// returns the encrypted text
string encrypt( string public_key, string pass_phrase, string text );
// returns the original text
string decrypt( string private_key, string pass_phrase, string encrypted_text );
Run Code Online (Sandbox Code Playgroud)
哪里string可以是a char*,a std::string或者易于转换为这两者的东西.且其中public_key和private_key可以是基本上什么,从与某些命令(GPG/SSL东西或任何)生成的密钥,与其它生成的密钥简单功能.
我已经研究了一些加密库(libgcrypt,libgpgme,openssl ...),但用这些库实现这些函数看起来并不容易:它们需要非表面的非对称加密知识和很多代码
无论如何,这项任务似乎并不罕见.如何实现上述两个功能?
我知道大多数编程语言都是图灵完备的,但我想知道是否可以使用任何编程语言(特别是任何编程范例)使用相同复杂度的算法来解决问题.
通过一个例子让我的答案更明确:是否有任何问题可以通过复杂的命令式算法解决x(比如说O(n)),但是不能通过具有相同复杂度的功能算法来解决(反之亦然)?
编辑: 算法本身可能不同.问题是解决问题的复杂性 - 使用语言中的任何可用方法.
language-agnostic algorithm complexity-theory programming-languages functional-programming
我想知道为什么C++的declare-before-use规则不能保存在类中.
看看这个例子:
#ifdef BASE
struct Base {
#endif
struct B;
struct A {
B *b;
A(){ b->foo(); }
};
struct B {
void foo() {}
};
#ifdef BASE
};
#endif
int main( ) { return 0; }
Run Code Online (Sandbox Code Playgroud)
如果定义了BASE,则代码有效.
在A的构造函数中,我可以使用尚未声明的B :: foo.
为什么这有效,而且大多数情况下,为什么只能在课堂上工作?
今天,我惊讶地发现了这一点
当sizeof运算符应用于类,结构或联合类型时,结果是该类型的对象中的字节数,以及为在单词边界上对齐成员而添加的任何填充.结果不一定与通过添加各个成员的存储要求而计算的大小相对应.
我不知道它,我很确定这个东西打破了我的一些旧代码:读取二进制文件,我曾经有这样的结构:
struct Header
{
union {
char identc[4];
uint32 ident;
};
uint16 version;
};
Run Code Online (Sandbox Code Playgroud)
并fread通过sizeof以下方式直接读取这6个字节:
fread( &header, sizeof(header), 1, f );
Run Code Online (Sandbox Code Playgroud)
但现在sizeof(header)回来了8!
是否有可能sizeof(header)返回旧的GCC版本6,或者我的想法完全消失了?
无论如何是否有任何其他运算符(或预处理器指令或其他)让编译器知道结构有多大 - 不包括填充?
否则,从一个不需要编写太多代码的文件中读取原始数据结构的干净方法是什么?
编辑:我知道这不是读取/写入二进制数据的正确方法:根据机器的字节顺序和内容,我会得到不同的结果.无论如何,这种方法是最快的方法,我是juist试图读取一些二进制数据以快速获取其内容,而不是编写一个我将在未来使用或发布的好应用程序.
我需要编写一个类,其构造函数对对象进行常量引用并将其存储在本地.
为了避免我可以预见的大多数常见错误,我只想接受对非临时错误的引用(即:引用左值).
如何编写一个仅对非临时引用的常量引用的函数?
当然,即使非临时性也可能超出范围,从而打破了我的阶级行为,但我相信通过禁止临时引用,我将避免大多数错误.