我可以输入别名来显示所有别名的列表.
但是对于功能,我所能做的就是贪图我.bash_profile.
只获取该文件中的那些,而不是在子文件中定义的或动态的.
有没有更方便的方法来找出目前定义的功能?
我见过以下问题,有人问如何从html中删除着色器: WebGL - 是否有在HTML中嵌入着色器的替代方法?
有一些精心设计的解决方法可以加载到包含问题答案中建议的着色器的文件中.
在我看到的教程中,着色器代码直接嵌入在html中.javascript代码使用getElementById引用它.但由于很多原因,将着色器直接嵌入到html中很难看.为什么我不能使用src =属性在外部引用它?
<script type="x-shader/x-fragment" id="shader-fs" src="util/fs"></script>
Run Code Online (Sandbox Code Playgroud)
以上不起作用,我只想知道为什么不行.这显然与脚本本身的限制有关,但我不明白.
这是我之前的问题的后续内容:SO 4403861,因为建议的解决方案打破了依赖关系,使makefile无用.我无法弄清楚为什么.
我正在使用gnu make 3.82我有一个规则,如果已经创建了obj目录:
objdir:=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
Run Code Online (Sandbox Code Playgroud)
但是,如果obj目录不存在,则make失败.我希望make能够根据需要自动创建../obj,所以我添加了我认为非常简单的内容:
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
if [ ! -d $(objdir) ] ; then mkdir $(objdir) ; fi
Run Code Online (Sandbox Code Playgroud)
当我这样做时,每次都要强制编译.为什么?除非没有目录,否则不应该发生mkdir?为什么这个简单的改变破坏了依赖?
我刚读了一篇关于C++ 0x标准的文章:http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/
它表示nullptr强类型,这意味着它可以与整数0区分开来.
f(int);
f(char* p);
f(nullptr); // calls char* version
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我很有兴趣知道标准说nullptr两个指针功能:
f(char* p);
f(int* p);
f(nullptr);
Run Code Online (Sandbox Code Playgroud)
我需要演员吗?是nullptr模板化的吗?
f((int*)(nullptr);
f(static_cast<int*>(nullptr));
f(nullptr<int>); // I would prefer this
Run Code Online (Sandbox Code Playgroud) 我们一直在银行开发大型金融应用程序.它开始是15万行非常糟糕的代码.到1个月前,它下降到一半多一点,但可执行文件的大小仍然很大.我预计,因为我们只是使代码更具可读性,但模板化代码仍然生成大量目标代码,我们只是通过我们的努力更有效率.
应用程序分为大约5个共享对象和一个主要对象.其中一个较大的共享对象是40Mb,甚至在代码缩小时也增长到50.
我对代码开始增长并不感到惊讶,因为毕竟我们正在添加一些功能.但我很惊讶它增长了20%.当然没有人接近编写20%的代码,所以我很难想象它是如何增长的那么多.这个模块对我来说很难分析,但是在周五,我有一个新的数据点可以解释一下.
SOAP服务器可能有10个提要.代码是自动生成的,非常糟糕.每个服务都有一个具有完全相同代码的解析器类,如:
#include <boost/shared_ptr.hpp>
#include <xercesstuff...>
class ParserService1 {
public:
void parse() {
try {
Service1ContentHandler*p = new Service1ContentHandler( ... );
parser->setContentHandler(p);
parser->parser();
} catch (SAX ...) {
...
}
}
};
Run Code Online (Sandbox Code Playgroud)
这些类完全没必要,单个函数可以工作.每个ContentHandler类都使用相同的7或8个变量自动生成,我可以与继承共享.
因此,当我从代码中删除解析器类时,我希望代码的大小会降低.但是只有10项服务,我没想到它会从38Mb降到36Mb.这是一个令人发指的符号数量.
我唯一能想到的是每个解析器都包含boost :: shared_ptr,一些Xerces解析器的东西,不知何故,编译器和链接器为每个文件重复存储所有这些符号.无论如何我很想知道.
所以,任何人都可以建议我如何追踪为什么这样的简单修改会产生如此大的影响?我可以在模块上使用nm来查看里面的符号,但这会产生一些痛苦的,大量的半可读内容.
此外,当一位同事用我的新库运行她的代码时,用户时间从1分55秒到1分25秒.实时是高度可变的,因为我们正在等待慢速SOAP服务器(恕我直言,SOAP是一个非常糟糕的CORBA替代品......)但CPU时间非常稳定.我本来期望通过减少代码大小来获得一点点提升,但最重要的是,在具有大容量内存的服务器上,我真的很惊讶速度受到如此大的影响,考虑到我没有改变架构的XML处理本身.
我将在星期二更进一步,希望能获得更多信息,但如果有人知道如何能得到这么大的改进,我很想知道.
更新:我确认,事实上,在任务中使用调试符号似乎根本不会改变运行时间.我这样做是通过创建一个包含许多东西的头文件来实现的,包括在这里产生效果的两个:boost共享指针和一些xerces XML解析器.似乎没有运行时性能损失(我检查过,因为两个答案之间存在意见分歧).但是,我还验证了包含头文件为每个实例创建调试符号,即使剥离的二进制文件大小不变.因此,如果您包含给定文件,即使您甚至不使用它,也会有一些固定数量的符号反对该对象,这些符号在链接时未折叠在一起,即使它们大概相同.
我的代码看起来像:
#include "includetorture.h"
void f1()
{
f2(); // call the function in the next file
}
Run Code Online (Sandbox Code Playgroud)
我的特定包含文件的大小约为每个源文件100k.据推测,如果我包括更多,它会更高.包含的总可执行文件大约是600k,没有大约9k.我验证了增长与包含文件的数量呈线性关系,但剥离的代码大小相同,不管它应该如何.
很明显,我错误地认为这是性能提升的原因.我想我现在已经解决了这个问题.虽然我没有删除太多代码,但我确实简化了大量的大型xml字符串处理,并大大减少了通过代码的路径,这可能就是原因.
我安装了cygwin(最新的1.7.xx?),然后安装了eclipse cdt(Juno).
当我尝试构建一个hello world项目时,尽管eclipse确定安装了cygwin,但它没有用.
所以我手动将c:\ cygwin\bin添加到路径中,该路径找到了cygwin中的所有可执行文件,包括g ++,make ld等.
现在,eclipse可以构建项目,但是在调试时,gdb启动并找不到源代码.它声称它找不到:
/cygdrive/c/users/me/workspace/test1/test1.cc.即使这正是它的确切位置.就好像cygwin的目录系统不起作用.
我可以手动加载来源:
C:\用户\我\工作区\ test1的\ test1.cc
调试器工作,但下次我开始一个新项目时,我必须再做一次.你如何指示eclipse/cygwin组合正确查找源代码?
或者,Mingw更容易吗?我遇到类似的问题,eclipse看到mingw存在,但构建失败,因为它找不到可执行文件.
我们一直在开发一个 OpenGL 程序,glad 是在两年前的夏天构建的,在 Linux 和 Windows 上的显卡上工作,例如 Ubuntu 20.04LTS 下的 NVIDIA 2060、Windows 和 Ubuntu 上的 Intel、GeForce 940mx 等。
在 Linux 上,我个人在这台笔记本电脑上使用的驱动程序是 nouveau。
*-display
description: VGA compatible controller
product: HD Graphics 620
vendor: Intel Corporation
physical id: 2
bus info: pci@0000:00:02.0
version: 02
width: 64 bits
clock: 33MHz
capabilities: pciexpress msi pm vga_controller bus_master cap_list rom
configuration: driver=i915 latency=0
resources: irq:129 memory:a2000000-a2ffffff memory:b0000000-bfffffff ioport:4000(size=64) memory:c0000-dffff
*-display
description: 3D controller
product: GM108M [GeForce 940MX]
vendor: NVIDIA Corporation
physical id: 0
bus …Run Code Online (Sandbox Code Playgroud) 我已经成功地写在gcc的一些内联汇编右移一位以下的一些很好的说明:http://www.cs.dartmouth.edu/~sergey/cs108/2009/gcc-inline-asm.pdf
这是一个例子:
static inline int ror(int v) {
asm ("ror %0;" :"=r"(v) /* output */ :"0"(v) /* input */ );
return v;
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望代码能够计算时钟周期,并且已经看到一些错误的(可能是微软)格式.我不知道如何在gcc中做这些事情.有帮助吗?
unsigned __int64 inline GetRDTSC() {
__asm {
; Flush the pipeline
XOR eax, eax
CPUID
; Get RDTSC counter in edx:eax
RDTSC
}
}
Run Code Online (Sandbox Code Playgroud)
我试过了:
static inline unsigned long long getClocks() {
asm("xor %%eax, %%eax" );
asm(CPUID);
asm(RDTSC : : %%edx %%eax); //Get RDTSC counter in edx:eax
Run Code Online (Sandbox Code Playgroud)
但我不知道如何让edx:eax对以干净的方式返回64位,并且不知道如何真正冲洗管道.
另外,我找到的最佳源代码是:http://www.strchr.com/performance_measurements_with_rdtsc
那是提到奔腾,所以如果有不同的方式在不同的英特尔/ AMD变种上做,请告诉我.我更喜欢适用于所有x86平台的东西,即使它有点难看,也适用于每种变体的一系列解决方案,但我不介意了解它.
在 C++ 中,我知道创建多行字符串的最佳规范方法是创建相邻的字符串并让编译器在编译时连接它们,如下所示:
string s = "This is a very long string ...\n"
" and it keeps on going...";
Run Code Online (Sandbox Code Playgroud)
在 Java 中,我知道这样做的唯一方法是使用连接:
String s = "This is a very long string ...\n" +
" and it keeps on going...";
Run Code Online (Sandbox Code Playgroud)
问题是,这是否在运行时生成单个字符串,或者 java 实际上也在编译时连接?问题出现的原因是由于以下行为:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // this prints true, because the compiler
// generates only one "abc" object
String s3 = "a";
s3 += "bc";
System.out.println(s1 == s3); // false
Run Code Online (Sandbox Code Playgroud) 对于某些目的,分配大量的虚拟空间和仅在被访问的页面中的页面将是高效的。分配大量内存是瞬时的,实际上并没有获取页面:
char* p = new char[1024*1024*1024*256];
Run Code Online (Sandbox Code Playgroud)
好的,上面指出的是错误的,因为它是一个32位数字。
我希望new可以调用malloc来调用sbrk,并且当我访问起始位置之外的4Gb位置时,它试图将任务内存扩展那么多吗?
这是完整的程序:
#include <cstdint>
int main() {
constexpr uint64_t GB = 1ULL << 30;
char* p = new char[256*GB]; // allocate large block of virtual space
p[0] = 1;
p[1000000000] = 1;
p[2000000000] = 1;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试分配大量内存时,我得到bad_alloc,所以显然malloc无法工作。
我的印象是mmap可以映射到文件,但是由于建议这样做,因此我正在调查它。
好的,mmap似乎支持虚拟内存大区域的分配,但是它需要文件描述符。创建巨大的内存中数据结构可能是一个胜利,但如果必须由文件支持,则不是这样:
即使我不喜欢附加到文件的想法,下面的代码也使用mmap。我不知道要在虚拟内存中放入多少数字,所以选择了0x800000000。mmap返回-1,因此显然我在做错事情:
#include <cstdint>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main() {
constexpr uint64_t GB = 1ULL << 30;
void *addr = (void*)0x8000000000ULL;
int fd = creat("garbagefile.dat", 0660);
char* p = (char*)mmap(addr, 256*GB, PROT_READ|PROT_WRITE, …Run Code Online (Sandbox Code Playgroud) c++ ×4
assembly ×1
bash ×1
c++11 ×1
clock ×1
constants ×1
cygwin ×1
debugging ×1
eclipse ×1
function ×1
glsl ×1
gnu-make ×1
intel ×1
java ×1
javascript ×1
linux ×1
makefile ×1
nullptr ×1
opengl ×1
optimization ×1
performance ×1
rules ×1
shader ×1
shell ×1
string ×1
symbols ×1
three.js ×1
types ×1
unix ×1
webgl ×1